diff options
Diffstat (limited to 'llvm/lib/Target/X86')
-rw-r--r-- | llvm/lib/Target/X86/X86TargetAsmInfo.cpp | 52 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86TargetAsmInfo.h | 32 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86TargetMachine.cpp | 2 |
3 files changed, 49 insertions, 37 deletions
diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp index c6a76f210ae..fcd797ed6d2 100644 --- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/llvm/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}; - -X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { - const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>(); - - AsmTransCBE = x86_asm_table; - - AssemblerDialect = Subtarget->getAsmFlavor(); -} - -bool X86TargetAsmInfo::LowerToBSwap(CallInst *CI) const { +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_INSTANTIATION( + bool X86TargetAsmInfo<TargetAsmInfo>::ExpandInlineAsm(CallInst*) const); +TEMPLATE_INSTANTIATION( + bool X86TargetAsmInfo<TargetAsmInfo>::LowerToBSwap(CallInst*) const); + +template <class BaseTAI> +bool X86TargetAsmInfo<BaseTAI>::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 <class BaseTAI> +bool X86TargetAsmInfo<BaseTAI>::ExpandInlineAsm(CallInst *CI) const { InlineAsm *IA = cast<InlineAsm>(CI->getCalledValue()); std::vector<InlineAsm::ConstraintInfo> Constraints = IA->ParseConstraints(); @@ -125,7 +125,7 @@ bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const { } X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { + X86TargetAsmInfo<DarwinTargetAsmInfo>(TM) { const X86Subtarget* Subtarget = &DTM->getSubtarget<X86Subtarget>(); bool is64Bit = Subtarget->is64Bit(); @@ -225,7 +225,7 @@ X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, } X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM), ELFTargetAsmInfo(TM) { + X86TargetAsmInfo<ELFTargetAsmInfo>(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/llvm/lib/Target/X86/X86TargetAsmInfo.h b/llvm/lib/Target/X86/X86TargetAsmInfo.h index d7e11e0c248..9100fc0092c 100644 --- a/llvm/lib/Target/X86/X86TargetAsmInfo.h +++ b/llvm/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 <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(); + } 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<TargetAsmInfo> X86GenericTargetAsmInfo; + + EXTERN_TEMPLATE_INSTANTIATION(class X86TargetAsmInfo<TargetAsmInfo>); + + struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo<DarwinTargetAsmInfo> { explicit X86DarwinTargetAsmInfo(const X86TargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct X86ELFTargetAsmInfo : public X86TargetAsmInfo, - public ELFTargetAsmInfo { + struct X86ELFTargetAsmInfo : public X86TargetAsmInfo<ELFTargetAsmInfo> { 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/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp index 5be5c5d5e68..08753e70e8c 100644 --- a/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/llvm/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); } } |