diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-26 01:24:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-26 01:24:18 +0000 |
commit | 30c4a3b9a896e2cbb4ef91d46f751a9c48558da4 (patch) | |
tree | 272b43047ebbd69fc95910fdd7595621579187f1 | |
parent | c993250dd2a4e4f6629179613b6b0757108319e7 (diff) |
finish simplifying DarwinTargetAsmInfo::SelectSectionForGlobal
for now. Make the section switching directives more consistent
by not including \n and including \t for them all.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77107 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Target/TargetAsmInfo.h | 9 | ||||
-rw-r--r-- | lib/Target/DarwinTargetAsmInfo.cpp | 39 | ||||
-rw-r--r-- | test/CodeGen/X86/global-sections.ll | 17 |
3 files changed, 42 insertions, 23 deletions
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index b9a877e920..e1ac6969aa 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -65,6 +65,12 @@ namespace llvm { K == DataRelRO || K == DataRelROLocal || K == RODataMergeConst || K == RODataMergeStr; } + + /// isReadOnlyWithDynamicInit - Return true if this data is readonly, but + /// the dynamic linker has to write to it to apply relocations. + bool isReadOnlyWithDynamicInit() const { + return K == DataRelRO || K == DataRelROLocal; + } bool isBSS() const { return K == BSS || K == ThreadBSS; @@ -87,6 +93,9 @@ namespace llvm { } bool isMergableString() const { return K == RODataMergeStr; } + bool isMergableConstant() const { + return K == RODataMergeStr || K == RODataMergeConst; + } static SectionKind get(Kind K) { SectionKind Res = { K }; diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp index 6be9aa0285..1356f671e0 100644 --- a/lib/Target/DarwinTargetAsmInfo.cpp +++ b/lib/Target/DarwinTargetAsmInfo.cpp @@ -39,7 +39,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) // there, if needed. SixteenByteConstantSection = 0; - ReadOnlySection = getUnnamedSection("\t.const\n", SectionFlags::None); + ReadOnlySection = getUnnamedSection("\t.const", SectionFlags::None); TextCoalSection = getNamedSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions", @@ -48,7 +48,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) SectionFlags::None); ConstDataCoalSection = getNamedSection("\t__DATA,__const_coal,coalesced", SectionFlags::None); - ConstDataSection = getUnnamedSection(".const_data", SectionFlags::None); + ConstDataSection = getUnnamedSection("\t.const_data", SectionFlags::None); DataCoalSection = getNamedSection("\t__DATA,__datacoal_nt,coalesced", SectionFlags::Writable); @@ -75,7 +75,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) // Sections: CStringSection = "\t.cstring"; - JumpTableDataSection = "\t.const\n"; + JumpTableDataSection = "\t.const"; BSSSection = 0; if (TM.getRelocationModel() == Reloc::Static) { @@ -131,7 +131,6 @@ DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV, // FIXME: Use sectionflags:linkonce instead of isWeakForLinker() here. bool isWeak = GV->isWeakForLinker(); - bool isNonStatic = TM.getRelocationModel() != Reloc::Static; if (Kind.isCode()) return isWeak ? TextCoalSection : TextSection; @@ -148,30 +147,24 @@ DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV, if (Kind.isMergableString()) return MergeableStringSection(cast<GlobalVariable>(GV)); - switch (Kind.getKind()) { - case SectionKind::Data: - case SectionKind::DataRelLocal: - case SectionKind::DataRel: - case SectionKind::BSS: - if (cast<GlobalVariable>(GV)->isConstant()) - return ConstDataSection; - return DataSection; - - case SectionKind::ROData: - case SectionKind::DataRelRO: - case SectionKind::DataRelROLocal: - return isNonStatic ? ConstDataSection : getReadOnlySection(); - case SectionKind::RODataMergeConst: { + if (Kind.isMergableConstant()) { const Type *Ty = cast<GlobalVariable>(GV)->getInitializer()->getType(); const TargetData *TD = TM.getTargetData(); return getSectionForMergableConstant(TD->getTypeAllocSize(Ty), 0); } - default: - llvm_unreachable("Unsuported section kind for global"); - } - // FIXME: Do we have any extra special weird cases? - return NULL; + // If this is marked const, put it into a const section. But if the dynamic + // linker needs to write to it, put it in the data segment. + if (Kind.isReadOnlyWithDynamicInit()) + return ConstDataSection; + + // FIXME: ROData -> const in -static mode that is relocatable but they happen + // by the static linker. Why not mergable? + if (Kind.isReadOnly()) + return getReadOnlySection(); + + // Otherwise, just drop the variable in the normal data section. + return DataSection; } const Section* diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index ab3c5922e7..ef31defeb5 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -23,3 +23,20 @@ ; DARWIN: .section __TEXT,__const_coal,coalesced ; DARWIN: _G2: ; DARWIN: .long 42 + + +; int * const G3 = &G1; +@G3 = constant i32* @G1 + +; DARWIN: .const_data +; DARWIN: .globl _G3 +; DARWIN: _G3: +; DARWIN: .long _G1 + + +; _Complex long long const G4 = 34; +@G4 = constant {i64,i64} { i64 34, i64 0 } + +; DARWIN: .const +; DARWIN: _G4: +; .long 34 |