diff options
-rw-r--r-- | include/llvm/Target/DarwinTargetAsmInfo.h | 2 | ||||
-rw-r--r-- | include/llvm/Target/ELFTargetAsmInfo.h | 2 | ||||
-rw-r--r-- | include/llvm/Target/TargetAsmInfo.h | 2 | ||||
-rw-r--r-- | lib/Target/ARM/ARMTargetAsmInfo.cpp | 37 | ||||
-rw-r--r-- | lib/Target/ARM/ARMTargetAsmInfo.h | 34 | ||||
-rw-r--r-- | lib/Target/ARM/ARMTargetMachine.cpp | 2 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 17 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCTargetAsmInfo.h | 33 | ||||
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 188 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.cpp | 48 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.h | 32 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetMachine.cpp | 2 |
12 files changed, 185 insertions, 214 deletions
diff --git a/include/llvm/Target/DarwinTargetAsmInfo.h b/include/llvm/Target/DarwinTargetAsmInfo.h index dab591aa03..0ca5a70555 100644 --- a/include/llvm/Target/DarwinTargetAsmInfo.h +++ b/include/llvm/Target/DarwinTargetAsmInfo.h @@ -24,7 +24,7 @@ namespace llvm { class Type; class Mangler; - struct DarwinTargetAsmInfo: public TargetAsmInfo { + struct DarwinTargetAsmInfo: public virtual TargetAsmInfo { const Section* TextCoalSection; const Section* ConstDataCoalSection; const Section* ConstDataSection; diff --git a/include/llvm/Target/ELFTargetAsmInfo.h b/include/llvm/Target/ELFTargetAsmInfo.h index 593d9b14f8..3dacb33eb3 100644 --- a/include/llvm/Target/ELFTargetAsmInfo.h +++ b/include/llvm/Target/ELFTargetAsmInfo.h @@ -23,7 +23,7 @@ namespace llvm { class GlobalVariable; class Type; - struct ELFTargetAsmInfo: public TargetAsmInfo { + struct ELFTargetAsmInfo: public virtual TargetAsmInfo { explicit ELFTargetAsmInfo(const TargetMachine &TM); virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const; diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index e3a8a5720e..c93d189cc6 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -124,7 +124,6 @@ namespace llvm { private: mutable StringMap<Section> Sections; mutable SectionFlags::FlagsStringsMapType FlagsStrings; - void fillDefaultValues(); protected: //===------------------------------------------------------------------===// // Properties to be set by the target writer, used to configure asm printer. @@ -511,7 +510,6 @@ namespace llvm { public: TargetAsmInfo(); - TargetAsmInfo(const TargetMachine &TM); virtual ~TargetAsmInfo(); const Section* getNamedSection(const char *Name, diff --git a/lib/Target/ARM/ARMTargetAsmInfo.cpp b/lib/Target/ARM/ARMTargetAsmInfo.cpp index 81bec515da..7afbab344b 100644 --- a/lib/Target/ARM/ARMTargetAsmInfo.cpp +++ b/lib/Target/ARM/ARMTargetAsmInfo.cpp @@ -17,7 +17,7 @@ #include <cctype> using namespace llvm; -const char *const llvm::arm_asm_table[] = { +static const char *const arm_asm_table[] = { "{r0}", "r0", "{r1}", "r1", "{r2}", "r2", @@ -42,10 +42,21 @@ const char *const llvm::arm_asm_table[] = { "{cc}", "cc", 0,0}; -TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo<TargetAsmInfo>); +ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) { + AsmTransCBE = arm_asm_table; + + AlignmentIsInBytes = false; + Data64bitsDirective = 0; + CommentString = "@"; + ConstantPoolSection = "\t.text\n"; + COMMDirectiveTakesAlignment = false; + InlineAsmStart = "@ InlineAsm Start"; + InlineAsmEnd = "@ InlineAsm End"; + LCOMMDirective = "\t.lcomm\t"; +} ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM): - ARMTargetAsmInfo<DarwinTargetAsmInfo>(TM) { + ARMTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { Subtarget = &DTM->getSubtarget<ARMSubtarget>(); GlobalPrefix = "_"; @@ -93,7 +104,7 @@ ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM): } ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM): - ARMTargetAsmInfo<ELFTargetAsmInfo>(TM) { + ARMTargetAsmInfo(TM), ELFTargetAsmInfo(TM) { Subtarget = &ETM->getSubtarget<ARMSubtarget>(); NeedsSet = false; @@ -127,15 +138,13 @@ ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM): /// Count the number of comma-separated arguments. /// Do not try to detect errors. -template <class BaseTAI> -unsigned ARMTargetAsmInfo<BaseTAI>::countArguments(const char* p) const { +unsigned ARMTargetAsmInfo::countArguments(const char* p) const { unsigned count = 0; while (*p && isspace(*p) && *p != '\n') p++; count++; - while (*p && *p!='\n' && - strncmp(p, BaseTAI::CommentString, - strlen(BaseTAI::CommentString))!=0) { + while (*p && *p!='\n' && + strncmp(p, CommentString, strlen(CommentString))!=0) { if (*p==',') count++; p++; @@ -145,8 +154,7 @@ unsigned ARMTargetAsmInfo<BaseTAI>::countArguments(const char* p) const { /// Count the length of a string enclosed in quote characters. /// Do not try to detect errors. -template <class BaseTAI> -unsigned ARMTargetAsmInfo<BaseTAI>::countString(const char* p) const { +unsigned ARMTargetAsmInfo::countString(const char* p) const { unsigned count = 0; while (*p && isspace(*p) && *p!='\n') p++; @@ -158,8 +166,7 @@ unsigned ARMTargetAsmInfo<BaseTAI>::countString(const char* p) const { } /// ARM-specific version of TargetAsmInfo::getInlineAsmLength. -template <class BaseTAI> -unsigned ARMTargetAsmInfo<BaseTAI>::getInlineAsmLength(const char *s) const { +unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *s) const { // Make a lowercase-folded version of s for counting purposes. char *q, *s_copy = (char *)malloc(strlen(s) + 1); strcpy(s_copy, s); @@ -185,7 +192,7 @@ unsigned ARMTargetAsmInfo<BaseTAI>::getInlineAsmLength(const char *s) const { break; } // Ignore everything from comment char(s) to EOL - if (strncmp(Str, BaseTAI::CommentString, strlen(BaseTAI::CommentString))==-0) + if (strncmp(Str, CommentString, strlen(CommentString))==-0) atInsnStart = false; // FIXME do something like the following for non-Darwin else if (*Str == '.' && Subtarget->isTargetDarwin()) { @@ -275,7 +282,7 @@ unsigned ARMTargetAsmInfo<BaseTAI>::getInlineAsmLength(const char *s) const { Length += 4; // ARM } } - if (*Str == '\n' || *Str == BaseTAI::SeparatorChar) + if (*Str == '\n' || *Str == SeparatorChar) atInsnStart = true; } free(s_copy); diff --git a/lib/Target/ARM/ARMTargetAsmInfo.h b/lib/Target/ARM/ARMTargetAsmInfo.h index 9e6f8568f7..9030d065bd 100644 --- a/lib/Target/ARM/ARMTargetAsmInfo.h +++ b/lib/Target/ARM/ARMTargetAsmInfo.h @@ -14,31 +14,19 @@ #ifndef ARMTARGETASMINFO_H #define ARMTARGETASMINFO_H -#include "ARMTargetMachine.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/ELFTargetAsmInfo.h" #include "llvm/Target/DarwinTargetAsmInfo.h" -#include "llvm/Support/Compiler.h" -namespace llvm { +#include "ARMSubtarget.h" - extern const char *const arm_asm_table[]; +namespace llvm { - template <class BaseTAI> - struct ARMTargetAsmInfo : public BaseTAI { - explicit ARMTargetAsmInfo(const ARMTargetMachine &TM): - BaseTAI(TM) { - BaseTAI::AsmTransCBE = arm_asm_table; + // Forward declaration. + class ARMTargetMachine; - BaseTAI::AlignmentIsInBytes = false; - BaseTAI::Data64bitsDirective = 0; - BaseTAI::CommentString = "@"; - BaseTAI::ConstantPoolSection = "\t.text\n"; - BaseTAI::COMMDirectiveTakesAlignment = false; - BaseTAI::InlineAsmStart = "@ InlineAsm Start"; - BaseTAI::InlineAsmEnd = "@ InlineAsm End"; - BaseTAI::LCOMMDirective = "\t.lcomm\t"; - } + struct ARMTargetAsmInfo : public virtual TargetAsmInfo { + explicit ARMTargetAsmInfo(const ARMTargetMachine &TM); const ARMSubtarget *Subtarget; @@ -47,15 +35,13 @@ namespace llvm { unsigned countString(const char *p) const; }; - typedef ARMTargetAsmInfo<TargetAsmInfo> ARMGenericTargetAsmInfo; - - EXTERN_TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo<TargetAsmInfo>); - - struct ARMDarwinTargetAsmInfo : public ARMTargetAsmInfo<DarwinTargetAsmInfo> { + struct ARMDarwinTargetAsmInfo : public virtual ARMTargetAsmInfo, + public virtual DarwinTargetAsmInfo { explicit ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM); }; - struct ARMELFTargetAsmInfo : public ARMTargetAsmInfo<ELFTargetAsmInfo> { + struct ARMELFTargetAsmInfo : public virtual ARMTargetAsmInfo, + public virtual ELFTargetAsmInfo { explicit ARMELFTargetAsmInfo(const ARMTargetMachine &TM); }; diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp index 29a9d84866..061307837f 100644 --- a/lib/Target/ARM/ARMTargetMachine.cpp +++ b/lib/Target/ARM/ARMTargetMachine.cpp @@ -120,7 +120,7 @@ const TargetAsmInfo *ARMTargetMachine::createTargetAsmInfo() const { case ARMSubtarget::isELF: return new ARMELFTargetAsmInfo(*this); default: - return new ARMGenericTargetAsmInfo(*this); + return new ARMTargetAsmInfo(*this); } } diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 717ddd6a15..6988e78196 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -19,10 +19,21 @@ using namespace llvm; using namespace llvm::dwarf; -TEMPLATE_INSTANTIATION(class PPCTargetAsmInfo<TargetAsmInfo>); +PPCTargetAsmInfo::PPCTargetAsmInfo(const PPCTargetMachine &TM) { + bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); + + ZeroDirective = "\t.space\t"; + SetDirective = "\t.set"; + Data64bitsDirective = isPPC64 ? "\t.quad\t" : 0; + AlignmentIsInBytes = false; + LCOMMDirective = "\t.lcomm\t"; + InlineAsmStart = "# InlineAsm Start"; + InlineAsmEnd = "# InlineAsm End"; + AssemblerDialect = TM.getSubtargetImpl()->getAsmFlavor(); +} PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM): - PPCTargetAsmInfo<DarwinTargetAsmInfo>(TM) { + PPCTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { PCSymbol = "."; CommentString = ";"; GlobalPrefix = "_"; @@ -92,7 +103,7 @@ PPCDarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) : - PPCTargetAsmInfo<ELFTargetAsmInfo>(TM) { + PPCTargetAsmInfo(TM), ELFTargetAsmInfo(TM) { CommentString = "#"; GlobalPrefix = ""; PrivateGlobalPrefix = ""; diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.h b/lib/Target/PowerPC/PPCTargetAsmInfo.h index a533d5fc60..c3160e3462 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.h +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.h @@ -14,43 +14,28 @@ #ifndef PPCTARGETASMINFO_H #define PPCTARGETASMINFO_H -#include "PPCTargetMachine.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/DarwinTargetAsmInfo.h" #include "llvm/Target/ELFTargetAsmInfo.h" -#include "llvm/Support/Compiler.h" namespace llvm { - template <class BaseTAI> - struct PPCTargetAsmInfo : public BaseTAI { - explicit PPCTargetAsmInfo(const PPCTargetMachine &TM): - BaseTAI(TM) { - const PPCSubtarget *Subtarget = &TM.getSubtarget<PPCSubtarget>(); - bool isPPC64 = Subtarget->isPPC64(); - - BaseTAI::ZeroDirective = "\t.space\t"; - BaseTAI::SetDirective = "\t.set"; - BaseTAI::Data64bitsDirective = isPPC64 ? "\t.quad\t" : 0; - BaseTAI::AlignmentIsInBytes = false; - BaseTAI::LCOMMDirective = "\t.lcomm\t"; - BaseTAI::InlineAsmStart = "# InlineAsm Start"; - BaseTAI::InlineAsmEnd = "# InlineAsm End"; - BaseTAI::AssemblerDialect = Subtarget->getAsmFlavor(); - } - }; - - typedef PPCTargetAsmInfo<TargetAsmInfo> PPCGenericTargetAsmInfo; + // Forward declaration. + class PPCTargetMachine; - EXTERN_TEMPLATE_INSTANTIATION(class PPCTargetAsmInfo<TargetAsmInfo>); + struct PPCTargetAsmInfo : public virtual TargetAsmInfo { + explicit PPCTargetAsmInfo(const PPCTargetMachine &TM); + }; - struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo<DarwinTargetAsmInfo> { + struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo, + public DarwinTargetAsmInfo { explicit PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo<ELFTargetAsmInfo> { + struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo, + public ELFTargetAsmInfo { explicit PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 03fd326fa4..1c883ada90 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -25,108 +25,100 @@ using namespace llvm; -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; - 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; - 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; +TargetAsmInfo::TargetAsmInfo() : + TextSection(0), + DataSection(0), + 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), + 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), + 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("\t.text", SectionFlags::Code); DataSection = getUnnamedSection("\t.data", SectionFlags::Writeable); } -TargetAsmInfo::TargetAsmInfo() { - fillDefaultValues(); -} - -TargetAsmInfo::TargetAsmInfo(const TargetMachine &TM) { - fillDefaultValues(); -} - TargetAsmInfo::~TargetAsmInfo() { } diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index a8930b8f22..c6a76f210a 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -25,22 +25,27 @@ using namespace llvm; using namespace llvm::dwarf; -const char *const llvm::x86_asm_table[] = { - "{si}", "S", - "{di}", "D", - "{ax}", "a", - "{cx}", "c", - "{memory}", "memory", - "{flags}", "", - "{dirflag}", "", - "{fpsr}", "", - "{cc}", "cc", - 0,0}; - -TEMPLATE_INSTANTIATION(class X86TargetAsmInfo<TargetAsmInfo>); - -template <class BaseTAI> -bool X86TargetAsmInfo<BaseTAI>::LowerToBSwap(CallInst *CI) const { +static const char *const x86_asm_table[] = { + "{si}", "S", + "{di}", "D", + "{ax}", "a", + "{cx}", "c", + "{memory}", "memory", + "{flags}", "", + "{dirflag}", "", + "{fpsr}", "", + "{cc}", "cc", + 0,0}; + +X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { + const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>(); + + AsmTransCBE = x86_asm_table; + + AssemblerDialect = Subtarget->getAsmFlavor(); +} + +bool X86TargetAsmInfo::LowerToBSwap(CallInst *CI) const { // FIXME: this should verify that we are targetting a 486 or better. If not, // we will turn this bswap into something that will be lowered to logical ops // instead of emitting the bswap asm. For now, we don't support 486 or lower @@ -69,8 +74,7 @@ bool X86TargetAsmInfo<BaseTAI>::LowerToBSwap(CallInst *CI) const { return true; } -template <class BaseTAI> -bool X86TargetAsmInfo<BaseTAI>::ExpandInlineAsm(CallInst *CI) const { +bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const { InlineAsm *IA = cast<InlineAsm>(CI->getCalledValue()); std::vector<InlineAsm::ConstraintInfo> Constraints = IA->ParseConstraints(); @@ -121,7 +125,7 @@ bool X86TargetAsmInfo<BaseTAI>::ExpandInlineAsm(CallInst *CI) const { } X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo<DarwinTargetAsmInfo>(TM) { + X86TargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { const X86Subtarget* Subtarget = &DTM->getSubtarget<X86Subtarget>(); bool is64Bit = Subtarget->is64Bit(); @@ -221,7 +225,7 @@ X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, } X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo<ELFTargetAsmInfo>(TM) { + X86TargetAsmInfo(TM), ELFTargetAsmInfo(TM) { CStringSection = ".rodata.str"; PrivateGlobalPrefix = ".L"; @@ -298,7 +302,7 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, } X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM): - X86GenericTargetAsmInfo(TM) { + X86TargetAsmInfo(TM) { X86TM = &TM; GlobalPrefix = "_"; @@ -404,7 +408,7 @@ std::string X86COFFTargetAsmInfo::printSectionFlags(unsigned flags) const { } X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM): - X86GenericTargetAsmInfo(TM) { + X86TargetAsmInfo(TM) { GlobalPrefix = "_"; CommentString = ";"; diff --git a/lib/Target/X86/X86TargetAsmInfo.h b/lib/Target/X86/X86TargetAsmInfo.h index 9100fc0092..d7e11e0c24 100644 --- a/lib/Target/X86/X86TargetAsmInfo.h +++ b/lib/Target/X86/X86TargetAsmInfo.h @@ -14,25 +14,17 @@ #ifndef X86TARGETASMINFO_H #define X86TARGETASMINFO_H -#include "X86TargetMachine.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/ELFTargetAsmInfo.h" #include "llvm/Target/DarwinTargetAsmInfo.h" -#include "llvm/Support/Compiler.h" namespace llvm { - extern const char *const x86_asm_table[]; + // Forward declaration. + class X86TargetMachine; - template <class BaseTAI> - struct X86TargetAsmInfo : public BaseTAI { - explicit X86TargetAsmInfo(const X86TargetMachine &TM): - BaseTAI(TM) { - const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>(); - - BaseTAI::AsmTransCBE = x86_asm_table; - BaseTAI::AssemblerDialect = Subtarget->getAsmFlavor(); - } + struct X86TargetAsmInfo : public virtual TargetAsmInfo { + explicit X86TargetAsmInfo(const X86TargetMachine &TM); virtual bool ExpandInlineAsm(CallInst *CI) const; @@ -40,23 +32,21 @@ namespace llvm { bool LowerToBSwap(CallInst *CI) const; }; - typedef X86TargetAsmInfo<TargetAsmInfo> X86GenericTargetAsmInfo; - - EXTERN_TEMPLATE_INSTANTIATION(class X86TargetAsmInfo<TargetAsmInfo>); - - struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo<DarwinTargetAsmInfo> { + struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo, + public DarwinTargetAsmInfo { explicit X86DarwinTargetAsmInfo(const X86TargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct X86ELFTargetAsmInfo : public X86TargetAsmInfo<ELFTargetAsmInfo> { + struct X86ELFTargetAsmInfo : public X86TargetAsmInfo, + public ELFTargetAsmInfo { explicit X86ELFTargetAsmInfo(const X86TargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct X86COFFTargetAsmInfo : public X86GenericTargetAsmInfo { + struct X86COFFTargetAsmInfo : public X86TargetAsmInfo { explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; @@ -67,11 +57,9 @@ namespace llvm { const X86TargetMachine *X86TM; }; - struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo { + struct X86WinTargetAsmInfo : public X86TargetAsmInfo { explicit X86WinTargetAsmInfo(const X86TargetMachine &TM); }; - } // namespace llvm #endif - diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 08753e70e8..5be5c5d5e6 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -54,7 +54,7 @@ const TargetAsmInfo *X86TargetMachine::createTargetAsmInfo() const { case X86Subtarget::isWindows: return new X86WinTargetAsmInfo(*this); default: - return new X86GenericTargetAsmInfo(*this); + return new X86TargetAsmInfo(*this); } } |