From 1c1eeb6b7b012b0324b9279a08c4365d2a450c77 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Wed, 24 Sep 2008 22:22:27 +0000 Subject: [PATCH] Get rid of virtual inheritance for ARM TAI llvm-svn: 56587 --- lib/Target/ARM/ARMTargetAsmInfo.cpp | 37 ++++++++++++----------------- lib/Target/ARM/ARMTargetAsmInfo.h | 34 ++++++++++++++++++-------- lib/Target/ARM/ARMTargetMachine.cpp | 2 +- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/lib/Target/ARM/ARMTargetAsmInfo.cpp b/lib/Target/ARM/ARMTargetAsmInfo.cpp index 7afbab344b8..81bec515da7 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,10 @@ 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"; -} +TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo); ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM): - ARMTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) { + ARMTargetAsmInfo(TM) { Subtarget = &DTM->getSubtarget(); GlobalPrefix = "_"; @@ -104,7 +93,7 @@ ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM): } ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM): - ARMTargetAsmInfo(TM), ELFTargetAsmInfo(TM) { + ARMTargetAsmInfo(TM) { Subtarget = &ETM->getSubtarget(); NeedsSet = false; @@ -138,13 +127,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 +145,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 +158,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 +185,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 +275,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); } }