From: Chris Lattner Date: Sun, 26 Jul 2009 01:24:18 +0000 (+0000) Subject: finish simplifying DarwinTargetAsmInfo::SelectSectionForGlobal X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=397792d98139e34220ce2775a91d807a36a6fbfc;p=platform%2Fupstream%2Fllvm.git finish simplifying DarwinTargetAsmInfo::SelectSectionForGlobal for now. Make the section switching directives more consistent by not including \n and including \t for them all. llvm-svn: 77107 --- diff --git a/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h index b9a877e..e1ac696 100644 --- a/llvm/include/llvm/Target/TargetAsmInfo.h +++ b/llvm/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/llvm/lib/Target/DarwinTargetAsmInfo.cpp b/llvm/lib/Target/DarwinTargetAsmInfo.cpp index 6be9aa0..1356f67 100644 --- a/llvm/lib/Target/DarwinTargetAsmInfo.cpp +++ b/llvm/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(GV)); - switch (Kind.getKind()) { - case SectionKind::Data: - case SectionKind::DataRelLocal: - case SectionKind::DataRel: - case SectionKind::BSS: - if (cast(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(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/llvm/test/CodeGen/X86/global-sections.ll b/llvm/test/CodeGen/X86/global-sections.ll index ab3c592..ef31def 100644 --- a/llvm/test/CodeGen/X86/global-sections.ll +++ b/llvm/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