X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetAsmInfo.cpp;h=5236786ddad0e19c27b7224a00c1dba4beebb977;hb=4cb1e13769856716261a4d315f8202bd918502c3;hp=536f16d6578a22d6e0d62ecca9bddba3c2366763;hpb=c25e1ea5e9aa54952b6736a9579e25a5c2d8139f;p=oota-llvm.git diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 536f16d6578..5236786ddad 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -13,121 +13,118 @@ //===----------------------------------------------------------------------===// #include "llvm/Constants.h" +#include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" #include "llvm/Function.h" #include "llvm/Module.h" #include "llvm/Type.h" #include "llvm/Target/TargetAsmInfo.h" +#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Support/Dwarf.h" +#include "llvm/Support/ErrorHandling.h" #include #include - using namespace llvm; -TargetAsmInfo::TargetAsmInfo() : - TextSection("\t.text"), - TextSection_(0), - DataSection("\t.data"), - DataSection_(0), - BSSSection("\t.bss"), - BSSSection_(0), - ReadOnlySection(0), - ReadOnlySection_(0), - SmallDataSection(0), - SmallBSSSection(0), - SmallRODataSection(0), - TLSDataSection("\t.section .tdata,\"awT\",@progbits"), - TLSDataSection_(0), - TLSBSSSection("\t.section .tbss,\"awT\",@nobits"), - TLSBSSSection_(0), - ZeroFillDirective(0), - NonexecutableStackDirective(0), - NeedsSet(false), - MaxInstLength(4), - PCSymbol("$"), - SeparatorChar(';'), - CommentString("#"), - GlobalPrefix(""), - PrivateGlobalPrefix("."), - LessPrivateGlobalPrefix(""), - JumpTableSpecialLabelPrefix(0), - GlobalVarAddrPrefix(""), - GlobalVarAddrSuffix(""), - FunctionAddrPrefix(""), - FunctionAddrSuffix(""), - PersonalityPrefix(""), - PersonalitySuffix(""), - NeedsIndirectEncoding(false), - InlineAsmStart("#APP"), - InlineAsmEnd("#NO_APP"), - AssemblerDialect(0), - StringConstantPrefix(".str"), - ZeroDirective("\t.zero\t"), - ZeroDirectiveSuffix(0), - AsciiDirective("\t.ascii\t"), - AscizDirective("\t.asciz\t"), - Data8bitsDirective("\t.byte\t"), - Data16bitsDirective("\t.short\t"), - Data32bitsDirective("\t.long\t"), - Data64bitsDirective("\t.quad\t"), - AlignDirective("\t.align\t"), - AlignmentIsInBytes(true), - TextAlignFillValue(0), - SwitchToSectionDirective("\t.section\t"), - TextSectionStartSuffix(""), - DataSectionStartSuffix(""), - SectionEndDirectiveSuffix(0), - ConstantPoolSection("\t.section .rodata"), - JumpTableDataSection("\t.section .rodata"), - JumpTableDirective(0), - CStringSection(0), - CStringSection_(0), - StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"), - StaticDtorsSection("\t.section .dtors,\"aw\",@progbits"), - FourByteConstantSection(0), - FourByteConstantSection_(0), - EightByteConstantSection(0), - EightByteConstantSection_(0), - SixteenByteConstantSection(0), - SixteenByteConstantSection_(0), - GlobalDirective("\t.globl\t"), - SetDirective(0), - LCOMMDirective(0), - COMMDirective("\t.comm\t"), - COMMDirectiveTakesAlignment(true), - HasDotTypeDotSizeDirective(true), - UsedDirective(0), - WeakRefDirective(0), - WeakDefDirective(0), - HiddenDirective("\t.hidden\t"), - ProtectedDirective("\t.protected\t"), - AbsoluteDebugSectionOffsets(false), - AbsoluteEHSectionOffsets(false), - HasLEB128(false), - HasDotLocAndDotFile(false), - SupportsDebugInformation(false), - SupportsExceptionHandling(false), - DwarfRequiresFrameSection(true), - GlobalEHDirective(0), - SupportsWeakOmittedEHFrame(true), - DwarfSectionOffsetDirective(0), - DwarfAbbrevSection(".debug_abbrev"), - DwarfInfoSection(".debug_info"), - DwarfLineSection(".debug_line"), - DwarfFrameSection(".debug_frame"), - DwarfPubNamesSection(".debug_pubnames"), - DwarfPubTypesSection(".debug_pubtypes"), - DwarfStrSection(".debug_str"), - DwarfLocSection(".debug_loc"), - DwarfARangesSection(".debug_aranges"), - DwarfRangesSection(".debug_ranges"), - DwarfMacInfoSection(".debug_macinfo"), - DwarfEHFrameSection(".eh_frame"), - DwarfExceptionSection(".gcc_except_table"), - AsmTransCBE(0) { - TextSection_ = getUnnamedSection(TextSection); - DataSection_ = getUnnamedSection(DataSection); +TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm) +: TM(tm) { + BSSSection = "\t.bss"; + BSSSection_ = 0; + ReadOnlySection = 0; + SmallDataSection = 0; + SmallBSSSection = 0; + SmallRODataSection = 0; + TLSDataSection = 0; + TLSBSSSection = 0; + ZeroFillDirective = 0; + NonexecutableStackDirective = 0; + NeedsSet = false; + MaxInstLength = 4; + PCSymbol = "$"; + SeparatorChar = ';'; + CommentColumn = 60; + CommentString = "#"; + GlobalPrefix = ""; + PrivateGlobalPrefix = "."; + LessPrivateGlobalPrefix = ""; + JumpTableSpecialLabelPrefix = 0; + GlobalVarAddrPrefix = ""; + GlobalVarAddrSuffix = ""; + FunctionAddrPrefix = ""; + FunctionAddrSuffix = ""; + PersonalityPrefix = ""; + PersonalitySuffix = ""; + NeedsIndirectEncoding = false; + InlineAsmStart = "#APP"; + InlineAsmEnd = "#NO_APP"; + AssemblerDialect = 0; + AllowQuotesInName = false; + ZeroDirective = "\t.zero\t"; + ZeroDirectiveSuffix = 0; + AsciiDirective = "\t.ascii\t"; + AscizDirective = "\t.asciz\t"; + Data8bitsDirective = "\t.byte\t"; + Data16bitsDirective = "\t.short\t"; + Data32bitsDirective = "\t.long\t"; + Data64bitsDirective = "\t.quad\t"; + AlignDirective = "\t.align\t"; + AlignmentIsInBytes = true; + TextAlignFillValue = 0; + SwitchToSectionDirective = "\t.section\t"; + TextSectionStartSuffix = ""; + DataSectionStartSuffix = ""; + SectionEndDirectiveSuffix = 0; + ConstantPoolSection = "\t.section .rodata"; + JumpTableDataSection = "\t.section .rodata"; + JumpTableDirective = 0; + CStringSection = 0; + CStringSection_ = 0; + // FIXME: Flags are ELFish - replace with normal section stuff. + StaticCtorsSection = "\t.section .ctors,\"aw\",@progbits"; + StaticDtorsSection = "\t.section .dtors,\"aw\",@progbits"; + GlobalDirective = "\t.globl\t"; + SetDirective = 0; + LCOMMDirective = 0; + COMMDirective = "\t.comm\t"; + COMMDirectiveTakesAlignment = true; + HasDotTypeDotSizeDirective = true; + HasSingleParameterDotFile = true; + UsedDirective = 0; + WeakRefDirective = 0; + WeakDefDirective = 0; + // FIXME: These are ELFish - move to ELFTAI. + HiddenDirective = "\t.hidden\t"; + ProtectedDirective = "\t.protected\t"; + AbsoluteDebugSectionOffsets = false; + AbsoluteEHSectionOffsets = false; + HasLEB128 = false; + HasDotLocAndDotFile = false; + SupportsDebugInformation = false; + SupportsExceptionHandling = false; + DwarfRequiresFrameSection = true; + DwarfUsesInlineInfoSection = false; + Is_EHSymbolPrivate = true; + GlobalEHDirective = 0; + SupportsWeakOmittedEHFrame = true; + DwarfSectionOffsetDirective = 0; + DwarfAbbrevSection = ".debug_abbrev"; + DwarfInfoSection = ".debug_info"; + DwarfLineSection = ".debug_line"; + DwarfFrameSection = ".debug_frame"; + DwarfPubNamesSection = ".debug_pubnames"; + DwarfPubTypesSection = ".debug_pubtypes"; + DwarfDebugInlineSection = ".debug_inlined"; + DwarfStrSection = ".debug_str"; + DwarfLocSection = ".debug_loc"; + DwarfARangesSection = ".debug_aranges"; + DwarfRangesSection = ".debug_ranges"; + DwarfMacroInfoSection = ".debug_macinfo"; + DwarfEHFrameSection = ".eh_frame"; + DwarfExceptionSection = ".gcc_except_table"; + AsmTransCBE = 0; + TextSection = getUnnamedSection("\t.text", SectionFlags::Code); + DataSection = getUnnamedSection("\t.data", SectionFlags::Writeable); } TargetAsmInfo::~TargetAsmInfo() { @@ -173,6 +170,31 @@ static bool isSuitableForBSS(const GlobalVariable *GV) { return (C->isNullValue() && !GV->isConstant() && !NoZerosInBSS); } +static bool isConstantString(const Constant *C) { + // First check: is we have constant array of i8 terminated with zero + const ConstantArray *CVA = dyn_cast(C); + // Check, if initializer is a null-terminated string + if (CVA && CVA->isCString()) + return true; + + // Another possibility: [1 x i8] zeroinitializer + if (isa(C)) { + if (const ArrayType *Ty = dyn_cast(C->getType())) { + return (Ty->getElementType() == Type::Int8Ty && + Ty->getNumElements() == 1); + } + } + + return false; +} + +unsigned TargetAsmInfo::RelocBehaviour() const { + // By default - all relocations in PIC mode would force symbol to be + // placed in r/w section. + return (TM.getRelocationModel() != Reloc::Static ? + Reloc::LocalOrGlobal : Reloc::None); +} + SectionKind::Kind TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const { // Early exit - functions should be always in text sections. @@ -191,19 +213,30 @@ TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const { // check its initializer to decide, which section to output it into. Also // note, there is no thread-local r/o section. Constant *C = GVar->getInitializer(); - if (C->ContainsRelocations()) - return SectionKind::ROData; - else { - const ConstantArray *CVA = dyn_cast(C); + if (C->ContainsRelocations(Reloc::LocalOrGlobal)) { + // Decide, whether it is still possible to put symbol into r/o section. + unsigned Reloc = RelocBehaviour(); + + // We already did a query for 'all' relocs, thus - early exits. + if (Reloc == Reloc::LocalOrGlobal) + return SectionKind::Data; + else if (Reloc == Reloc::None) + return SectionKind::ROData; + else { + // Ok, target wants something funny. Honour it. + return (C->ContainsRelocations(Reloc) ? + SectionKind::Data : SectionKind::ROData); + } + } else { // Check, if initializer is a null-terminated string - if (CVA && CVA->isCString()) + if (isConstantString(C)) return SectionKind::RODataMergeStr; else return SectionKind::RODataMergeConst; } } - // Variable is not constant or thread-local - emit to generic data section. + // Variable either is not constant or thread-local - output to data section. return (isThreadLocal ? SectionKind::ThreadData : SectionKind::Data); } @@ -224,6 +257,10 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV, Flags |= SectionFlags::TLS; // FALLS THROUGH case SectionKind::Data: + case SectionKind::DataRel: + case SectionKind::DataRelLocal: + case SectionKind::DataRelRO: + case SectionKind::DataRelROLocal: case SectionKind::BSS: Flags |= SectionFlags::Writeable; break; @@ -240,7 +277,7 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV, Flags |= SectionFlags::Small; break; default: - assert(0 && "Unexpected section kind!"); + llvm_unreachable("Unexpected section kind!"); } if (GV->isWeakForLinker()) @@ -300,21 +337,21 @@ TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { return getNamedSection(Name.c_str(), Flags); } else { if (Kind == SectionKind::Text) - return getTextSection_(); + return getTextSection(); else if (isBSS(Kind) && getBSSSection_()) return getBSSSection_(); - else if (getReadOnlySection_() && SectionKind::isReadOnly(Kind)) - return getReadOnlySection_(); + else if (getReadOnlySection() && SectionKind::isReadOnly(Kind)) + return getReadOnlySection(); } - return getDataSection_(); + return getDataSection(); } // Lame default implementation. Calculate the section name for machine const. const Section* TargetAsmInfo::SelectSectionForMachineConst(const Type *Ty) const { // FIXME: Support data.rel stuff someday - return getDataSection_(); + return getDataSection(); } std::string @@ -325,6 +362,14 @@ TargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV, return ".gnu.linkonce.t." + GV->getName(); case SectionKind::Data: return ".gnu.linkonce.d." + GV->getName(); + case SectionKind::DataRel: + return ".gnu.linkonce.d.rel" + GV->getName(); + case SectionKind::DataRelLocal: + return ".gnu.linkonce.d.rel.local" + GV->getName(); + case SectionKind::DataRelRO: + return ".gnu.linkonce.d.rel.ro" + GV->getName(); + case SectionKind::DataRelROLocal: + return ".gnu.linkonce.d.rel.ro.local" + GV->getName(); case SectionKind::SmallData: return ".gnu.linkonce.s." + GV->getName(); case SectionKind::BSS: @@ -342,8 +387,9 @@ TargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV, case SectionKind::ThreadBSS: return ".gnu.linkonce.tb." + GV->getName(); default: - assert(0 && "Unknown section kind"); + llvm_unreachable("Unknown section kind"); } + return NULL; } const Section*