mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Get rid of virtual inheritance for ARM TAI
llvm-svn: 56587
This commit is contained in:
parent
3f07365446
commit
1c1eeb6b7b
@ -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);
|
||||
|
@ -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 <class BaseTAI>
|
||||
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<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);
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user