diff options
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 3cf59bc..654a615 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -2142,7 +2142,7 @@ static const Comdat *getWasmComdat(const GlobalValue *GV) { return C; } -static unsigned getWasmSectionFlags(SectionKind K) { +static unsigned getWasmSectionFlags(SectionKind K, bool Retain) { unsigned Flags = 0; if (K.isThreadLocal()) @@ -2151,11 +2151,22 @@ static unsigned getWasmSectionFlags(SectionKind K) { if (K.isMergeableCString()) Flags |= wasm::WASM_SEG_FLAG_STRINGS; + if (Retain) + Flags |= wasm::WASM_SEG_FLAG_RETAIN; + // TODO(sbc): Add suport for K.isMergeableConst() return Flags; } +void TargetLoweringObjectFileWasm::getModuleMetadata(Module &M) { + SmallVector<GlobalValue *, 4> Vec; + collectUsedGlobalVariables(M, Vec, false); + for (GlobalValue *GV : Vec) + if (auto *GO = dyn_cast<GlobalObject>(GV)) + Used.insert(GO); +} + MCSection *TargetLoweringObjectFileWasm::getExplicitSectionGlobal( const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const { // We don't support explict section names for functions in the wasm object @@ -2179,16 +2190,18 @@ MCSection *TargetLoweringObjectFileWasm::getExplicitSectionGlobal( Group = C->getName(); } - unsigned Flags = getWasmSectionFlags(Kind); + unsigned Flags = getWasmSectionFlags(Kind, Used.count(GO)); MCSectionWasm *Section = getContext().getWasmSection( Name, Kind, Flags, Group, MCContext::GenericSectionID); return Section; } -static MCSectionWasm *selectWasmSectionForGlobal( - MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang, - const TargetMachine &TM, bool EmitUniqueSection, unsigned *NextUniqueID) { +static MCSectionWasm * +selectWasmSectionForGlobal(MCContext &Ctx, const GlobalObject *GO, + SectionKind Kind, Mangler &Mang, + const TargetMachine &TM, bool EmitUniqueSection, + unsigned *NextUniqueID, bool Retain) { StringRef Group = ""; if (const Comdat *C = getWasmComdat(GO)) { Group = C->getName(); @@ -2213,7 +2226,7 @@ static MCSectionWasm *selectWasmSectionForGlobal( (*NextUniqueID)++; } - unsigned Flags = getWasmSectionFlags(Kind); + unsigned Flags = getWasmSectionFlags(Kind, Retain); return Ctx.getWasmSection(Name, Kind, Flags, Group, UniqueID); } @@ -2231,9 +2244,11 @@ MCSection *TargetLoweringObjectFileWasm::SelectSectionForGlobal( else EmitUniqueSection = TM.getDataSections(); EmitUniqueSection |= GO->hasComdat(); + bool Retain = Used.count(GO); + EmitUniqueSection |= Retain; return selectWasmSectionForGlobal(getContext(), GO, Kind, getMangler(), TM, - EmitUniqueSection, &NextUniqueID); + EmitUniqueSection, &NextUniqueID, Retain); } bool TargetLoweringObjectFileWasm::shouldPutJumpTableInFunctionSection( |