From 8490322fa9d4c3359015510e772e231273476739 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Wed, 24 Sep 2008 22:21:39 +0000 Subject: [PATCH] Use crazy template-based inheritance instead of virtual one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56585 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetAsmInfo.h | 2 + lib/Target/TargetAsmInfo.cpp | 188 +++++++++++++++------------- lib/Target/X86/X86TargetAsmInfo.cpp | 46 +++---- lib/Target/X86/X86TargetAsmInfo.h | 29 +++-- lib/Target/X86/X86TargetMachine.cpp | 2 +- 5 files changed, 140 insertions(+), 127 deletions(-) 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/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..d11f01628f5 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -25,27 +25,20 @@ 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(); - - 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 +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 +67,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 +119,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 +219,7 @@ X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, } X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM), ELFTargetAsmInfo(TM) { + X86TargetAsmInfo(TM) { CStringSection = ".rodata.str"; PrivateGlobalPrefix = ".L"; @@ -302,7 +296,7 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason, } X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM): - X86TargetAsmInfo(TM) { + X86GenericTargetAsmInfo(TM) { X86TM = &TM; GlobalPrefix = "_"; @@ -408,7 +402,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..3a5fa6d2baf 100644 --- a/lib/Target/X86/X86TargetAsmInfo.h +++ b/lib/Target/X86/X86TargetAsmInfo.h @@ -14,17 +14,24 @@ #ifndef X86TARGETASMINFO_H #define X86TARGETASMINFO_H +#include "X86TargetMachine.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/ELFTargetAsmInfo.h" #include "llvm/Target/DarwinTargetAsmInfo.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 +39,21 @@ namespace llvm { bool LowerToBSwap(CallInst *CI) const; }; - struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo, - public DarwinTargetAsmInfo { + typedef X86TargetAsmInfo X86GenericTargetAsmInfo; + + 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 +64,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); } } -- 2.34.1