forked from OSchip/llvm-project
200 lines
6.0 KiB
Diff
200 lines
6.0 KiB
Diff
Index: lib/MC/MCDisassembler/EDOperand.cpp
|
|
===================================================================
|
|
--- lib/MC/MCDisassembler/EDOperand.cpp (revision 146622)
|
|
+++ lib/MC/MCDisassembler/EDOperand.cpp (working copy)
|
|
@@ -30,8 +30,10 @@
|
|
MCOpIndex(mcOpIndex) {
|
|
unsigned int numMCOperands = 0;
|
|
|
|
- if (Disassembler.Key.Arch == Triple::x86 ||
|
|
- Disassembler.Key.Arch == Triple::x86_64) {
|
|
+ Triple::ArchType arch = Disassembler.TgtTriple.getArch();
|
|
+
|
|
+ if (arch == Triple::x86 ||
|
|
+ arch == Triple::x86_64) {
|
|
uint8_t operandType = inst.ThisInstInfo->operandTypes[opIndex];
|
|
|
|
switch (operandType) {
|
|
@@ -54,8 +56,8 @@
|
|
break;
|
|
}
|
|
}
|
|
- else if (Disassembler.Key.Arch == Triple::arm ||
|
|
- Disassembler.Key.Arch == Triple::thumb) {
|
|
+ else if (arch == Triple::arm ||
|
|
+ arch == Triple::thumb) {
|
|
uint8_t operandType = inst.ThisInstInfo->operandTypes[opIndex];
|
|
|
|
switch (operandType) {
|
|
@@ -126,7 +128,9 @@
|
|
void *arg) {
|
|
uint8_t operandType = Inst.ThisInstInfo->operandTypes[OpIndex];
|
|
|
|
- switch (Disassembler.Key.Arch) {
|
|
+ Triple::ArchType arch = Disassembler.TgtTriple.getArch();
|
|
+
|
|
+ switch (arch) {
|
|
default:
|
|
return -1;
|
|
case Triple::x86:
|
|
@@ -168,7 +172,7 @@
|
|
|
|
unsigned segmentReg = Inst.Inst->getOperand(MCOpIndex+4).getReg();
|
|
|
|
- if (segmentReg != 0 && Disassembler.Key.Arch == Triple::x86_64) {
|
|
+ if (segmentReg != 0 && arch == Triple::x86_64) {
|
|
unsigned fsID = Disassembler.registerIDWithName("FS");
|
|
unsigned gsID = Disassembler.registerIDWithName("GS");
|
|
|
|
Index: lib/MC/MCDisassembler/EDDisassembler.cpp
|
|
===================================================================
|
|
--- lib/MC/MCDisassembler/EDDisassembler.cpp (revision 146622)
|
|
+++ lib/MC/MCDisassembler/EDDisassembler.cpp (working copy)
|
|
@@ -98,16 +98,23 @@
|
|
|
|
EDDisassembler *EDDisassembler::getDisassembler(Triple::ArchType arch,
|
|
AssemblySyntax syntax) {
|
|
+ const char *triple = tripleFromArch(arch);
|
|
+ return getDisassembler(StringRef(triple), syntax);
|
|
+}
|
|
+
|
|
+EDDisassembler *EDDisassembler::getDisassembler(StringRef str,
|
|
+ AssemblySyntax syntax) {
|
|
CPUKey key;
|
|
- key.Arch = arch;
|
|
+ key.Triple = str.str();
|
|
key.Syntax = syntax;
|
|
|
|
EDDisassembler::DisassemblerMap_t::iterator i = sDisassemblers.find(key);
|
|
-
|
|
+
|
|
if (i != sDisassemblers.end()) {
|
|
- return i->second;
|
|
- } else {
|
|
- EDDisassembler* sdd = new EDDisassembler(key);
|
|
+ return i->second;
|
|
+ }
|
|
+ else {
|
|
+ EDDisassembler *sdd = new EDDisassembler(key);
|
|
if (!sdd->valid()) {
|
|
delete sdd;
|
|
return NULL;
|
|
@@ -119,10 +126,7 @@
|
|
}
|
|
|
|
return NULL;
|
|
-}
|
|
-
|
|
-EDDisassembler *EDDisassembler::getDisassembler(StringRef str,
|
|
- AssemblySyntax syntax) {
|
|
+
|
|
return getDisassembler(Triple(str).getArch(), syntax);
|
|
}
|
|
|
|
@@ -130,21 +134,20 @@
|
|
Valid(false),
|
|
HasSemantics(false),
|
|
ErrorStream(nulls()),
|
|
- Key(key) {
|
|
- const char *triple = tripleFromArch(key.Arch);
|
|
-
|
|
- if (!triple)
|
|
+ Key(key),
|
|
+ TgtTriple(key.Triple.c_str()) {
|
|
+ if (TgtTriple.getArch() == Triple::InvalidArch)
|
|
return;
|
|
|
|
- LLVMSyntaxVariant = getLLVMSyntaxVariant(key.Arch, key.Syntax);
|
|
+ LLVMSyntaxVariant = getLLVMSyntaxVariant(TgtTriple.getArch(), key.Syntax);
|
|
|
|
if (LLVMSyntaxVariant < 0)
|
|
return;
|
|
|
|
- std::string tripleString(triple);
|
|
+ std::string tripleString(key.Triple);
|
|
std::string errorString;
|
|
|
|
- Tgt = TargetRegistry::lookupTarget(tripleString,
|
|
+ Tgt = TargetRegistry::lookupTarget(key.Triple,
|
|
errorString);
|
|
|
|
if (!Tgt)
|
|
@@ -263,7 +266,7 @@
|
|
RegRMap[registerName] = registerIndex;
|
|
}
|
|
|
|
- switch (Key.Arch) {
|
|
+ switch (TgtTriple.getArch()) {
|
|
default:
|
|
break;
|
|
case Triple::x86:
|
|
@@ -331,7 +334,7 @@
|
|
const std::string &str) {
|
|
int ret = 0;
|
|
|
|
- switch (Key.Arch) {
|
|
+ switch (TgtTriple.getArch()) {
|
|
default:
|
|
return -1;
|
|
case Triple::x86:
|
|
@@ -356,8 +359,7 @@
|
|
context, *streamer,
|
|
*AsmInfo));
|
|
|
|
- StringRef triple = tripleFromArch(Key.Arch);
|
|
- OwningPtr<MCSubtargetInfo> STI(Tgt->createMCSubtargetInfo(triple, "", ""));
|
|
+ OwningPtr<MCSubtargetInfo> STI(Tgt->createMCSubtargetInfo(Key.Triple.c_str(), "", ""));
|
|
OwningPtr<MCTargetAsmParser>
|
|
TargetParser(Tgt->createMCAsmParser(*STI, *genericParser));
|
|
|
|
Index: lib/MC/MCDisassembler/EDDisassembler.h
|
|
===================================================================
|
|
--- lib/MC/MCDisassembler/EDDisassembler.h (revision 146622)
|
|
+++ lib/MC/MCDisassembler/EDDisassembler.h (working copy)
|
|
@@ -25,6 +25,7 @@
|
|
|
|
#include <map>
|
|
#include <set>
|
|
+#include <string>
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
@@ -74,21 +75,21 @@
|
|
/// pair
|
|
struct CPUKey {
|
|
/// The architecture type
|
|
- llvm::Triple::ArchType Arch;
|
|
+ std::string Triple;
|
|
|
|
/// The assembly syntax
|
|
AssemblySyntax Syntax;
|
|
|
|
/// operator== - Equality operator
|
|
bool operator==(const CPUKey &key) const {
|
|
- return (Arch == key.Arch &&
|
|
+ return (Triple == key.Triple &&
|
|
Syntax == key.Syntax);
|
|
}
|
|
|
|
/// operator< - Less-than operator
|
|
bool operator<(const CPUKey &key) const {
|
|
- return ((Arch < key.Arch) ||
|
|
- ((Arch == key.Arch) && Syntax < (key.Syntax)));
|
|
+ return ((Triple < key.Triple) ||
|
|
+ ((Triple == key.Triple) && Syntax < (key.Syntax)));
|
|
}
|
|
};
|
|
|
|
@@ -126,8 +127,10 @@
|
|
/// The stream to write errors to
|
|
llvm::raw_ostream &ErrorStream;
|
|
|
|
- /// The architecture/syntax pair for the current architecture
|
|
+ /// The triple/syntax pair for the current architecture
|
|
CPUKey Key;
|
|
+ /// The Triple fur the current architecture
|
|
+ Triple TgtTriple;
|
|
/// The LLVM target corresponding to the disassembler
|
|
const llvm::Target *Tgt;
|
|
/// The assembly information for the target architecture
|