diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 6988e78196f..0c1cdcca2d8 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -19,21 +19,8 @@ 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(); -} - PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM): - PPCTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { + PPCTargetAsmInfo(TM) { PCSymbol = "."; CommentString = ";"; GlobalPrefix = "_"; @@ -103,7 +90,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..2c78aade1e7 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.h +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.h @@ -14,28 +14,40 @@ #ifndef PPCTARGETASMINFO_H #define PPCTARGETASMINFO_H +#include "PPCTargetMachine.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/DarwinTargetAsmInfo.h" #include "llvm/Target/ELFTargetAsmInfo.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; + + 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;