diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 17 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h | 33 |
2 files changed, 27 insertions, 23 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 6988e78196f..717ddd6a15b 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/llvm/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<TargetAsmInfo>); PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM): - PPCTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { + PPCTargetAsmInfo<DarwinTargetAsmInfo>(TM) { PCSymbol = "."; CommentString = ";"; GlobalPrefix = "_"; @@ -103,7 +92,7 @@ PPCDarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) : - PPCTargetAsmInfo(TM), ELFTargetAsmInfo(TM) { + PPCTargetAsmInfo<ELFTargetAsmInfo>(TM) { CommentString = "#"; GlobalPrefix = ""; PrivateGlobalPrefix = ""; diff --git a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h index c3160e34628..a533d5fc60e 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.h +++ b/llvm/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; - - struct PPCTargetAsmInfo : public virtual TargetAsmInfo { - explicit PPCTargetAsmInfo(const PPCTargetMachine &TM); + 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(); + } }; - struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo, - public DarwinTargetAsmInfo { + typedef PPCTargetAsmInfo<TargetAsmInfo> PPCGenericTargetAsmInfo; + + EXTERN_TEMPLATE_INSTANTIATION(class PPCTargetAsmInfo<TargetAsmInfo>); + + struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo<DarwinTargetAsmInfo> { explicit PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; }; - struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo, - public ELFTargetAsmInfo { + struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo<ELFTargetAsmInfo> { explicit PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM); virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason, bool Global) const; |