X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FDarwinTargetAsmInfo.cpp;h=d7d675abf255ba1e687b944d885138e0ecf97e58;hb=0919a916bf152e08617e67f9d4b03db4769076e2;hp=311126d01134a4d06ef12efe43855a9007d2128f;hpb=cff2ea06af03fd44758d937455f2b0999cbda60b;p=oota-llvm.git diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp index 311126d0113..d7d675abf25 100644 --- a/lib/Target/DarwinTargetAsmInfo.cpp +++ b/lib/Target/DarwinTargetAsmInfo.cpp @@ -17,50 +17,120 @@ #include "llvm/Function.h" #include "llvm/GlobalVariable.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/Support/Mangler.h" #include "llvm/Target/DarwinTargetAsmInfo.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetData.h" using namespace llvm; -DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) { - DTM = &TM; +DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) + : TargetAsmInfo(TM) { CStringSection_ = getUnnamedSection("\t.cstring", SectionFlags::Mergeable | SectionFlags::Strings); - FourByteConstantSection_ = getUnnamedSection("\t.literal4\n", + FourByteConstantSection = getUnnamedSection("\t.literal4\n", + SectionFlags::Mergeable); + EightByteConstantSection = getUnnamedSection("\t.literal8\n", SectionFlags::Mergeable); - EightByteConstantSection_ = getUnnamedSection("\t.literal8\n", - SectionFlags::Mergeable); + // Note: 16-byte constant section is subtarget specific and should be provided - // there. + // there, if needed. + SixteenByteConstantSection = 0; - ReadOnlySection_ = getUnnamedSection("\t.const\n", SectionFlags::None); + ReadOnlySection = getUnnamedSection("\t.const\n", SectionFlags::None); - // FIXME: These should be named sections, really. TextCoalSection = - getUnnamedSection(".section __TEXT,__textcoal_nt,coalesced,pure_instructions", + getNamedSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions", SectionFlags::Code); - ConstDataCoalSection = - getUnnamedSection(".section __DATA,__const_coal,coalesced", - SectionFlags::None); + ConstTextCoalSection = getNamedSection("\t__TEXT,__const_coal,coalesced", + SectionFlags::None); + ConstDataCoalSection = getNamedSection("\t__DATA,__const_coal,coalesced", + SectionFlags::None); ConstDataSection = getUnnamedSection(".const_data", SectionFlags::None); - DataCoalSection = getUnnamedSection(".section __DATA,__datacoal_nt,coalesced", - SectionFlags::Writeable); + DataCoalSection = getNamedSection("\t__DATA,__datacoal_nt,coalesced", + SectionFlags::Writeable); + + + // Common settings for all Darwin targets. + // Syntax: + GlobalPrefix = "_"; + PrivateGlobalPrefix = "L"; + LessPrivateGlobalPrefix = "l"; // Marker for some ObjC metadata + StringConstantPrefix = "\1LC"; + NeedsSet = true; + NeedsIndirectEncoding = true; + AllowQuotesInName = true; + HasSingleParameterDotFile = false; + + // In non-PIC modes, emit a special label before jump tables so that the + // linker can perform more accurate dead code stripping. We do not check the + // relocation model here since it can be overridden later. + JumpTableSpecialLabelPrefix = "l"; + + // Directives: + WeakDefDirective = "\t.weak_definition "; + WeakRefDirective = "\t.weak_reference "; + HiddenDirective = "\t.private_extern "; + + // Sections: + CStringSection = "\t.cstring"; + JumpTableDataSection = "\t.const\n"; + BSSSection = 0; + + if (TM.getRelocationModel() == Reloc::Static) { + StaticCtorsSection = ".constructor"; + StaticDtorsSection = ".destructor"; + } else { + StaticCtorsSection = ".mod_init_func"; + StaticDtorsSection = ".mod_term_func"; + } + + DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug"; + DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug"; + DwarfLineSection = ".section __DWARF,__debug_line,regular,debug"; + DwarfFrameSection = ".section __DWARF,__debug_frame,regular,debug"; + DwarfPubNamesSection = ".section __DWARF,__debug_pubnames,regular,debug"; + DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes,regular,debug"; + DwarfStrSection = ".section __DWARF,__debug_str,regular,debug"; + DwarfLocSection = ".section __DWARF,__debug_loc,regular,debug"; + DwarfARangesSection = ".section __DWARF,__debug_aranges,regular,debug"; + DwarfRangesSection = ".section __DWARF,__debug_ranges,regular,debug"; + DwarfMacroInfoSection = ".section __DWARF,__debug_macinfo,regular,debug"; +} + +/// emitUsedDirectiveFor - On Darwin, internally linked data beginning with +/// the PrivateGlobalPrefix or the LessPrivateGlobalPrefix does not have the +/// directive emitted (this occurs in ObjC metadata). + +bool +DarwinTargetAsmInfo::emitUsedDirectiveFor(const GlobalValue* GV, + Mangler *Mang) const { + if (GV==0) + return false; + if (GV->hasLocalLinkage() && !isa(GV) && + ((strlen(getPrivateGlobalPrefix()) != 0 && + Mang->getValueName(GV).substr(0,strlen(getPrivateGlobalPrefix())) == + getPrivateGlobalPrefix()) || + (strlen(getLessPrivateGlobalPrefix()) != 0 && + Mang->getValueName(GV).substr(0,strlen(getLessPrivateGlobalPrefix())) == + getLessPrivateGlobalPrefix()))) + return false; + return true; } const Section* DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); bool isWeak = GV->isWeakForLinker(); - bool isNonStatic = (DTM->getRelocationModel() != Reloc::Static); + bool isNonStatic = TM.getRelocationModel() != Reloc::Static; switch (Kind) { case SectionKind::Text: if (isWeak) return TextCoalSection; else - return getTextSection_(); + return TextSection; case SectionKind::Data: case SectionKind::ThreadData: case SectionKind::BSS: @@ -68,13 +138,13 @@ DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { if (cast(GV)->isConstant()) return (isWeak ? ConstDataCoalSection : ConstDataSection); else - return (isWeak ? DataCoalSection : getDataSection_()); + return (isWeak ? DataCoalSection : DataSection); case SectionKind::ROData: return (isWeak ? ConstDataCoalSection : - (isNonStatic ? ConstDataSection : getReadOnlySection_())); + (isNonStatic ? ConstDataSection : getReadOnlySection())); case SectionKind::RODataMergeStr: return (isWeak ? - ConstDataCoalSection : + ConstTextCoalSection : MergeableStringSection(cast(GV))); case SectionKind::RODataMergeConst: return (isWeak ? @@ -85,39 +155,57 @@ DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { } // FIXME: Do we have any extra special weird cases? + return NULL; } const Section* DarwinTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const { - const TargetData *TD = DTM->getTargetData(); + const TargetData *TD = TM.getTargetData(); Constant *C = cast(GV)->getInitializer(); - const Type *Type = cast(C)->getType()->getElementType(); + const Type *Ty = cast(C->getType())->getElementType(); - unsigned Size = TD->getABITypeSize(Type); + unsigned Size = TD->getTypeAllocSize(Ty); if (Size) { - const TargetData *TD = DTM->getTargetData(); unsigned Align = TD->getPreferredAlignment(GV); if (Align <= 32) return getCStringSection_(); } - return getReadOnlySection_(); + return getReadOnlySection(); } const Section* DarwinTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const { - const TargetData *TD = DTM->getTargetData(); - Constant *C = cast(GV)->getInitializer(); + Constant *C = GV->getInitializer(); + + return MergeableConstSection(C->getType()); +} - unsigned Size = TD->getABITypeSize(C->getType()); +inline const Section* +DarwinTargetAsmInfo::MergeableConstSection(const Type *Ty) const { + const TargetData *TD = TM.getTargetData(); + + unsigned Size = TD->getTypeAllocSize(Ty); if (Size == 4) - return FourByteConstantSection_; + return FourByteConstantSection; else if (Size == 8) - return EightByteConstantSection_; - else if (Size == 16 && SixteenByteConstantSection_) - return SixteenByteConstantSection_; + return EightByteConstantSection; + else if (Size == 16 && SixteenByteConstantSection) + return SixteenByteConstantSection; + + return getReadOnlySection(); +} + +const Section* +DarwinTargetAsmInfo::SelectSectionForMachineConst(const Type *Ty) const { + const Section* S = MergeableConstSection(Ty); + + // Handle weird special case, when compiling PIC stuff. + if (S == getReadOnlySection() && + TM.getRelocationModel() != Reloc::Static) + return ConstDataSection; - return getReadOnlySection_(); + return S; } std::string