Get rid of virtual inheritance for ARM TAI
authorAnton Korobeynikov <asl@math.spbu.ru>
Wed, 24 Sep 2008 22:22:27 +0000 (22:22 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Wed, 24 Sep 2008 22:22:27 +0000 (22:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56587 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMTargetAsmInfo.cpp
lib/Target/ARM/ARMTargetAsmInfo.h
lib/Target/ARM/ARMTargetMachine.cpp

index 7afbab344b822ec02fe2e3969c844244ef2029ec..81bec515da7fe4df24353883f583bbbe004ebdaf 100644 (file)
@@ -17,7 +17,7 @@
 #include <cctype>
 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<TargetAsmInfo>);
 
 ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM):
-  ARMTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) {
+  ARMTargetAsmInfo<DarwinTargetAsmInfo>(TM) {
   Subtarget = &DTM->getSubtarget<ARMSubtarget>();
 
   GlobalPrefix = "_";
@@ -104,7 +93,7 @@ ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM):
 }
 
 ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM):
-  ARMTargetAsmInfo(TM), ELFTargetAsmInfo(TM) {
+  ARMTargetAsmInfo<ELFTargetAsmInfo>(TM) {
   Subtarget = &ETM->getSubtarget<ARMSubtarget>();
 
   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 <class BaseTAI>
+unsigned ARMTargetAsmInfo<BaseTAI>::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 <class BaseTAI>
+unsigned ARMTargetAsmInfo<BaseTAI>::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 <class BaseTAI>
+unsigned ARMTargetAsmInfo<BaseTAI>::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);
index 9030d065bd60fae39ef6d8e7f030c11575a57e0a..9e6f8568f76aea5dc7d0475cdde572ab5d338698 100644 (file)
 #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[];
+
+  template <class BaseTAI>
+  struct ARMTargetAsmInfo : public BaseTAI {
+    explicit ARMTargetAsmInfo(const ARMTargetMachine &TM):
+      BaseTAI(TM) {
+      BaseTAI::AsmTransCBE = arm_asm_table;
 
-  struct ARMTargetAsmInfo : public virtual TargetAsmInfo {
-    explicit ARMTargetAsmInfo(const ARMTargetMachine &TM);
+      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<TargetAsmInfo> ARMGenericTargetAsmInfo;
+
+  EXTERN_TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo<TargetAsmInfo>);
+
+  struct ARMDarwinTargetAsmInfo : public ARMTargetAsmInfo<DarwinTargetAsmInfo> {
     explicit ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM);
   };
 
-  struct ARMELFTargetAsmInfo : public virtual ARMTargetAsmInfo,
-                               public virtual ELFTargetAsmInfo {
+  struct ARMELFTargetAsmInfo : public ARMTargetAsmInfo<ELFTargetAsmInfo> {
     explicit ARMELFTargetAsmInfo(const ARMTargetMachine &TM);
   };
 
index 061307837f2484b38a8586e7342f9e37f244a0af..29a9d848663f933d1d81b8733e99fcd0b202bd6f 100644 (file)
@@ -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);
   }
 }