X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetAsmInfo.cpp;h=3f5f1bd3eb26d0ef1b53806bf20e4d23a88ed2c3;hb=1c723b714566007b6f09db5d5f6b85df2dd0c2fc;hp=a124922e6cbdb4931bb7f5689718fbed16589986;hpb=8f092252d3fe75064abe330e0e6f75e213f4ac06;p=oota-llvm.git diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index a124922e6cb..3f5f1bd3eb2 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -13,19 +13,21 @@ //===----------------------------------------------------------------------===// #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 #include - using namespace llvm; -void TargetAsmInfo::fillDefaultValues() { +TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm) +: TM(tm) { BSSSection = "\t.bss"; BSSSection_ = 0; ReadOnlySection = 0; @@ -56,6 +58,7 @@ void TargetAsmInfo::fillDefaultValues() { InlineAsmEnd = "#NO_APP"; AssemblerDialect = 0; StringConstantPrefix = ".str"; + AllowQuotesInName = false; ZeroDirective = "\t.zero\t"; ZeroDirectiveSuffix = 0; AsciiDirective = "\t.ascii\t"; @@ -85,6 +88,7 @@ void TargetAsmInfo::fillDefaultValues() { COMMDirective = "\t.comm\t"; COMMDirectiveTakesAlignment = true; HasDotTypeDotSizeDirective = true; + HasSingleParameterDotFile = true; UsedDirective = 0; WeakRefDirective = 0; WeakDefDirective = 0; @@ -98,6 +102,8 @@ void TargetAsmInfo::fillDefaultValues() { SupportsDebugInformation = false; SupportsExceptionHandling = false; DwarfRequiresFrameSection = true; + DwarfUsesInlineInfoSection = false; + NonLocalEHFrameLabel = false; GlobalEHDirective = 0; SupportsWeakOmittedEHFrame = true; DwarfSectionOffsetDirective = 0; @@ -107,11 +113,12 @@ void TargetAsmInfo::fillDefaultValues() { DwarfFrameSection = ".debug_frame"; DwarfPubNamesSection = ".debug_pubnames"; DwarfPubTypesSection = ".debug_pubtypes"; + DwarfDebugInlineSection = ".debug_inlined"; DwarfStrSection = ".debug_str"; DwarfLocSection = ".debug_loc"; DwarfARangesSection = ".debug_aranges"; DwarfRangesSection = ".debug_ranges"; - DwarfMacInfoSection = ".debug_macinfo"; + DwarfMacroInfoSection = ".debug_macinfo"; DwarfEHFrameSection = ".eh_frame"; DwarfExceptionSection = ".gcc_except_table"; AsmTransCBE = 0; @@ -119,11 +126,6 @@ void TargetAsmInfo::fillDefaultValues() { DataSection = getUnnamedSection("\t.data", SectionFlags::Writeable); } -TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm) - : TM(tm) { - fillDefaultValues(); -} - TargetAsmInfo::~TargetAsmInfo() { } @@ -167,6 +169,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. @@ -185,19 +212,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); } @@ -218,6 +256,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; @@ -237,7 +279,7 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV, assert(0 && "Unexpected section kind!"); } - if (GV->mayBeOverridden()) + if (GV->isWeakForLinker()) Flags |= SectionFlags::Linkonce; } @@ -288,7 +330,7 @@ const Section* TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); - if (GV->mayBeOverridden()) { + if (GV->isWeakForLinker()) { std::string Name = UniqueSectionForGlobal(GV, Kind); unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str()); return getNamedSection(Name.c_str(), Flags); @@ -319,6 +361,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: @@ -338,6 +388,7 @@ TargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV, default: assert(0 && "Unknown section kind"); } + return NULL; } const Section*