diff --git a/include/llvm/Target/DarwinTargetAsmInfo.h b/include/llvm/Target/DarwinTargetAsmInfo.h index 0ca5a705556..dab591aa036 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 virtual TargetAsmInfo { + struct DarwinTargetAsmInfo: public 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 3dacb33eb32..593d9b14f87 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 virtual TargetAsmInfo { + struct ELFTargetAsmInfo: public 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 c93d189cc65..e3a8a5720e4 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -124,6 +124,7 @@ namespace llvm { private: mutable StringMap
Sections; mutable SectionFlags::FlagsStringsMapType FlagsStrings; + void fillDefaultValues(); protected: //===------------------------------------------------------------------===// // Properties to be set by the target writer, used to configure asm printer. @@ -510,6 +511,7 @@ 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 7afbab344b8..10b570cd82c 100644 --- a/lib/Target/ARM/ARMTargetAsmInfo.cpp +++ b/lib/Target/ARM/ARMTargetAsmInfo.cpp @@ -17,7 +17,7 @@ #include using namespace llvm; -static const char *const arm_asm_table[] = { +const char *const llvm::arm_asm_table[] = { "{r0}", "r0", "{r1}", "r1", "{r2}", "r2", @@ -42,21 +42,17 @@ static const char *const arm_asm_table[] = { "{cc}", "cc", 0,0}; -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"; -} +// Instantiate 'common' cases. +TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo); +TEMPLATE_INSTANTIATION( +unsigned ARMTargetAsmInfo::getInlineAsmLength(const char*) const); +TEMPLATE_INSTANTIATION( + unsigned ARMTargetAsmInfo::countArguments(const char*) const); +TEMPLATE_INSTANTIATION( + unsigned ARMTargetAsmInfo::countString(const char*) const); ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM): - ARMTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { + ARMTargetAsmInfo(TM) { Subtarget = &DTM->getSubtarget(); GlobalPrefix = "_"; @@ -104,7 +100,7 @@ ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM): } ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM): - ARMTargetAsmInfo(TM), ELFTargetAsmInfo(TM) { + ARMTargetAsmInfo(TM) { Subtarget = &ETM->getSubtarget(); NeedsSet = false; @@ -138,13 +134,15 @@ ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM): /// Count the number of comma-separated arguments. /// Do not try to detect errors. -unsigned ARMTargetAsmInfo::countArguments(const char* p) const { +template +unsigned ARMTargetAsmInfo::countArguments(const char* p) const { unsigned count = 0; while (*p && isspace(*p) && *p != '\n') p++; count++; - while (*p && *p!='\n' && - strncmp(p, CommentString, strlen(CommentString))!=0) { + while (*p && *p!='\n' && + strncmp(p, BaseTAI::CommentString, + strlen(BaseTAI::CommentString))!=0) { if (*p==',') count++; p++; @@ -154,7 +152,8 @@ unsigned ARMTargetAsmInfo::countArguments(const char* p) const { /// Count the length of a string enclosed in quote characters. /// Do not try to detect errors. -unsigned ARMTargetAsmInfo::countString(const char* p) const { +template +unsigned ARMTargetAsmInfo::countString(const char* p) const { unsigned count = 0; while (*p && isspace(*p) && *p!='\n') p++; @@ -166,7 +165,8 @@ unsigned ARMTargetAsmInfo::countString(const char* p) const { } /// ARM-specific version of TargetAsmInfo::getInlineAsmLength. -unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *s) const { +template +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); @@ -192,7 +192,7 @@ unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *s) const { break; } // Ignore everything from comment char(s) to EOL - if (strncmp(Str, CommentString, strlen(CommentString))==-0) + if (strncmp(Str, BaseTAI::CommentString, strlen(BaseTAI::CommentString))==-0) atInsnStart = false; // FIXME do something like the following for non-Darwin else if (*Str == '.' && Subtarget->isTargetDarwin()) { @@ -282,7 +282,7 @@ unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *s) const { Length += 4; // ARM } } - if (*Str == '\n' || *Str == SeparatorChar) + if (*Str == '\n' || *Str == BaseTAI::SeparatorChar) atInsnStart = true; } free(s_copy); diff --git a/lib/Target/ARM/ARMTargetAsmInfo.h b/lib/Target/ARM/ARMTargetAsmInfo.h index 9030d065bd6..9e6f8568f76 100644 --- a/lib/Target/ARM/ARMTargetAsmInfo.h +++ b/lib/Target/ARM/ARMTargetAsmInfo.h @@ -14,19 +14,31 @@ #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 "ARMSubtarget.h" +#include "llvm/Support/Compiler.h" namespace llvm { - // Forward declaration. - class ARMTargetMachine; + extern const char *const arm_asm_table[]; - struct ARMTargetAsmInfo : public virtual TargetAsmInfo { - explicit ARMTargetAsmInfo(const ARMTargetMachine &TM); + template + struct ARMTargetAsmInfo : public BaseTAI { + explicit ARMTargetAsmInfo(const ARMTargetMachine &TM): + BaseTAI(TM) { + BaseTAI::AsmTransCBE = arm_asm_table; + + 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"; + } const ARMSubtarget *Subtarget; @@ -35,13 +47,15 @@ namespace llvm { unsigned countString(const char *p) const; }; - struct ARMDarwinTargetAsmInfo : public virtual ARMTargetAsmInfo, - public virtual DarwinTargetAsmInfo { + typedef ARMTargetAsmInfo ARMGenericTargetAsmInfo; + + EXTERN_TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo); + + struct ARMDarwinTargetAsmInfo : public ARMTargetAsmInfo { explicit ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM); }; - struct ARMELFTargetAsmInfo : public virtual ARMTargetAsmInfo, - public virtual ELFTargetAsmInfo { + struct ARMELFTargetAsmInfo : public ARMTargetAsmInfo { explicit ARMELFTargetAsmInfo(const ARMTargetMachine &TM); }; diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp index 061307837f2..29a9d848663 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 ARMTargetAsmInfo(*this); + return new ARMGenericTargetAsmInfo(*this); } } diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 6988e78196f..717ddd6a15b 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -19,21 +19,10 @@ using namespace llvm; using namespace llvm::dwarf; -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(); -} +TEMPLATE_INSTANTIATION(class PPCTargetAsmInfo); PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM): - PPCTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { + PPCTargetAsmInfo(TM) { PCSymbol = "."; CommentString = ";"; GlobalPrefix = "_"; @@ -103,7 +92,7 @@ PPCDarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) : - PPCTargetAsmInfo(TM), ELFTargetAsmInfo(TM) { + PPCTargetAsmInfo(TM) { CommentString = "#"; GlobalPrefix = ""; PrivateGlobalPrefix = ""; diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.h b/lib/Target/PowerPC/PPCTargetAsmInfo.h index c3160e34628..a533d5fc60e 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.h +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.h @@ -14,28 +14,43 @@ #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 { - // Forward declaration. - class PPCTargetMachine; + template + struct PPCTargetAsmInfo : public BaseTAI { + explicit PPCTargetAsmInfo(const PPCTargetMachine &TM): + BaseTAI(TM) { + const PPCSubtarget *Subtarget = &TM.getSubtarget(); + bool isPPC64 = Subtarget->isPPC64(); - struct PPCTargetAsmInfo : public virtual TargetAsmInfo { - explicit PPCTargetAsmInfo(const PPCTargetMachine &TM); + 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(); + } }; - struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo, - public DarwinTargetAsmInfo { + typedef PPCTargetAsmInfo PPCGenericTargetAsmInfo; + + EXTERN_TEMPLATE_INSTANTIATION(class PPCTargetAsmInfo); + + struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo { explicit PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo, - public ELFTargetAsmInfo { + struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo { 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 1c883ada90c..03fd326fa49 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -25,100 +25,108 @@ using namespace llvm; -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) { +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; 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 c6a76f210ae..fcd797ed6d2 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -25,27 +25,26 @@ using namespace llvm; using namespace llvm::dwarf; -static const char *const x86_asm_table[] = { - "{si}", "S", - "{di}", "D", - "{ax}", "a", - "{cx}", "c", - "{memory}", "memory", - "{flags}", "", - "{dirflag}", "", - "{fpsr}", "", - "{cc}", "cc", - 0,0}; +const char *const llvm::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(); +TEMPLATE_INSTANTIATION(class X86TargetAsmInfo); +TEMPLATE_INSTANTIATION( + bool X86TargetAsmInfo::ExpandInlineAsm(CallInst*) const); +TEMPLATE_INSTANTIATION( + bool X86TargetAsmInfo::LowerToBSwap(CallInst*) const); - AsmTransCBE = x86_asm_table; - - AssemblerDialect = Subtarget->getAsmFlavor(); -} - -bool X86TargetAsmInfo::LowerToBSwap(CallInst *CI) const { +template +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 @@ -74,7 +73,8 @@ bool X86TargetAsmInfo::LowerToBSwap(CallInst *CI) const { return true; } -bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const { +template +bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const { InlineAsm *IA = cast(CI->getCalledValue()); std::vector Constraints = IA->ParseConstraints(); @@ -125,7 +125,7 @@ bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const { } X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { + X86TargetAsmInfo(TM) { const X86Subtarget* Subtarget = &DTM->getSubtarget(); bool is64Bit = Subtarget->is64Bit(); @@ -225,7 +225,7 @@ X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, } X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM), ELFTargetAsmInfo(TM) { + X86TargetAsmInfo(TM) { CStringSection = ".rodata.str"; PrivateGlobalPrefix = ".L"; @@ -302,7 +302,7 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, } X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM) { + X86GenericTargetAsmInfo(TM) { X86TM = &TM; GlobalPrefix = "_"; @@ -408,7 +408,7 @@ std::string X86COFFTargetAsmInfo::printSectionFlags(unsigned flags) const { } X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM) { + X86GenericTargetAsmInfo(TM) { GlobalPrefix = "_"; CommentString = ";"; diff --git a/lib/Target/X86/X86TargetAsmInfo.h b/lib/Target/X86/X86TargetAsmInfo.h index d7e11e0c248..9100fc0092c 100644 --- a/lib/Target/X86/X86TargetAsmInfo.h +++ b/lib/Target/X86/X86TargetAsmInfo.h @@ -14,17 +14,25 @@ #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 { - // Forward declaration. - class X86TargetMachine; + extern const char *const x86_asm_table[]; - struct X86TargetAsmInfo : public virtual TargetAsmInfo { - explicit X86TargetAsmInfo(const X86TargetMachine &TM); + template + struct X86TargetAsmInfo : public BaseTAI { + explicit X86TargetAsmInfo(const X86TargetMachine &TM): + BaseTAI(TM) { + const X86Subtarget *Subtarget = &TM.getSubtarget(); + + BaseTAI::AsmTransCBE = x86_asm_table; + BaseTAI::AssemblerDialect = Subtarget->getAsmFlavor(); + } virtual bool ExpandInlineAsm(CallInst *CI) const; @@ -32,21 +40,23 @@ namespace llvm { bool LowerToBSwap(CallInst *CI) const; }; - struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo, - public DarwinTargetAsmInfo { + typedef X86TargetAsmInfo X86GenericTargetAsmInfo; + + EXTERN_TEMPLATE_INSTANTIATION(class X86TargetAsmInfo); + + struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo { explicit X86DarwinTargetAsmInfo(const X86TargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct X86ELFTargetAsmInfo : public X86TargetAsmInfo, - public ELFTargetAsmInfo { + struct X86ELFTargetAsmInfo : public X86TargetAsmInfo { explicit X86ELFTargetAsmInfo(const X86TargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct X86COFFTargetAsmInfo : public X86TargetAsmInfo { + struct X86COFFTargetAsmInfo : public X86GenericTargetAsmInfo { explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; @@ -57,9 +67,11 @@ namespace llvm { const X86TargetMachine *X86TM; }; - struct X86WinTargetAsmInfo : public X86TargetAsmInfo { + struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo { explicit X86WinTargetAsmInfo(const X86TargetMachine &TM); }; + } // namespace llvm #endif + diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 5be5c5d5e68..08753e70e8c 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 X86TargetAsmInfo(*this); + return new X86GenericTargetAsmInfo(*this); } }