X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetAsmInfo.cpp;h=d687e2f44cfd7787a2b541d66fe0ade02550f762;hb=c94ebef1b1ea6dda54494a0a0eafc96ab685a531;hp=06b77dd26aa294e9b29bb26712942a25a568ed7d;hpb=b2dfb89e0e7f1ee3e4fe4a3a1b3af148f0aec34f;p=oota-llvm.git diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 06b77dd26aa..d687e2f44cf 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Constants.h" +#include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" #include "llvm/Function.h" #include "llvm/Module.h" @@ -25,109 +26,106 @@ 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); +void TargetAsmInfo::fillDefaultValues() { + 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 = ';'; + 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; + // 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; + SupportsMacInfoSection = true; + NonLocalEHFrameLabel = false; + 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("\t.text", SectionFlags::Code); + DataSection = getUnnamedSection("\t.data", SectionFlags::Writeable); +} + +TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm) + : TM(tm) { + fillDefaultValues(); } TargetAsmInfo::~TargetAsmInfo() { @@ -173,6 +171,25 @@ 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; +} + + SectionKind::Kind TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const { // Early exit - functions should be always in text sections. @@ -194,9 +211,8 @@ TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const { if (C->ContainsRelocations()) return SectionKind::ROData; else { - const ConstantArray *CVA = dyn_cast(C); // Check, if initializer is a null-terminated string - if (CVA && CVA->isCString()) + if (isConstantString(C)) return SectionKind::RODataMergeStr; else return SectionKind::RODataMergeConst; @@ -243,7 +259,7 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV, assert(0 && "Unexpected section kind!"); } - if (GV->isWeakForLinker()) + if (GV->mayBeOverridden()) Flags |= SectionFlags::Linkonce; } @@ -272,7 +288,7 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV, return Flags; } -std::string +const Section* TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { const Section* S; // Select section name @@ -286,13 +302,7 @@ TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { S = SelectSectionForGlobal(GV); } - if (!S->isNamed()) - return S->Name; - - // If section is named we need to switch into it via special '.section' - // directive and also append funky flags. Otherwise - section name is just - // some magic assembler directive. - return getSwitchToSectionDirective() + S->Name + getSectionFlags(S->Flags); + return S; } // Lame default implementation. Calculate the section name for global. @@ -300,27 +310,27 @@ const Section* TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); - if (GV->isWeakForLinker()) { + if (GV->mayBeOverridden()) { std::string Name = UniqueSectionForGlobal(GV, Kind); unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str()); 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 @@ -350,6 +360,7 @@ TargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV, default: assert(0 && "Unknown section kind"); } + return NULL; } const Section*