blob: 3c833aa8d85de9fe6c17c088c337da86573fce43 [file] [log] [blame]
Sean Callanane71e5ca2011-12-17 00:59:491Index: lib/MC/MCDisassembler/EDOperand.cpp
2===================================================================
3--- lib/MC/MCDisassembler/EDOperand.cpp (revision 146622)
4+++ lib/MC/MCDisassembler/EDOperand.cpp (working copy)
5@@ -30,8 +30,10 @@
6 MCOpIndex(mcOpIndex) {
7 unsigned int numMCOperands = 0;
8
9- if (Disassembler.Key.Arch == Triple::x86 ||
10- Disassembler.Key.Arch == Triple::x86_64) {
11+ Triple::ArchType arch = Disassembler.TgtTriple.getArch();
12+
13+ if (arch == Triple::x86 ||
14+ arch == Triple::x86_64) {
15 uint8_t operandType = inst.ThisInstInfo->operandTypes[opIndex];
16
17 switch (operandType) {
18@@ -54,8 +56,8 @@
19 break;
20 }
21 }
22- else if (Disassembler.Key.Arch == Triple::arm ||
23- Disassembler.Key.Arch == Triple::thumb) {
24+ else if (arch == Triple::arm ||
25+ arch == Triple::thumb) {
26 uint8_t operandType = inst.ThisInstInfo->operandTypes[opIndex];
27
28 switch (operandType) {
29@@ -126,7 +128,9 @@
30 void *arg) {
31 uint8_t operandType = Inst.ThisInstInfo->operandTypes[OpIndex];
32
33- switch (Disassembler.Key.Arch) {
34+ Triple::ArchType arch = Disassembler.TgtTriple.getArch();
35+
36+ switch (arch) {
37 default:
38 return -1;
39 case Triple::x86:
40@@ -168,7 +172,7 @@
41
42 unsigned segmentReg = Inst.Inst->getOperand(MCOpIndex+4).getReg();
43
44- if (segmentReg != 0 && Disassembler.Key.Arch == Triple::x86_64) {
45+ if (segmentReg != 0 && arch == Triple::x86_64) {
46 unsigned fsID = Disassembler.registerIDWithName("FS");
47 unsigned gsID = Disassembler.registerIDWithName("GS");
48
49Index: lib/MC/MCDisassembler/EDDisassembler.cpp
50===================================================================
51--- lib/MC/MCDisassembler/EDDisassembler.cpp (revision 146622)
52+++ lib/MC/MCDisassembler/EDDisassembler.cpp (working copy)
53@@ -98,16 +98,23 @@
54
55 EDDisassembler *EDDisassembler::getDisassembler(Triple::ArchType arch,
56 AssemblySyntax syntax) {
57+ const char *triple = tripleFromArch(arch);
58+ return getDisassembler(StringRef(triple), syntax);
59+}
60+
61+EDDisassembler *EDDisassembler::getDisassembler(StringRef str,
62+ AssemblySyntax syntax) {
63 CPUKey key;
64- key.Arch = arch;
65+ key.Triple = str.str();
66 key.Syntax = syntax;
67
68 EDDisassembler::DisassemblerMap_t::iterator i = sDisassemblers.find(key);
69-
70+
71 if (i != sDisassemblers.end()) {
72- return i->second;
73- } else {
74- EDDisassembler* sdd = new EDDisassembler(key);
75+ return i->second;
76+ }
77+ else {
78+ EDDisassembler *sdd = new EDDisassembler(key);
79 if (!sdd->valid()) {
80 delete sdd;
81 return NULL;
82@@ -119,10 +126,7 @@
83 }
84
85 return NULL;
86-}
87-
88-EDDisassembler *EDDisassembler::getDisassembler(StringRef str,
89- AssemblySyntax syntax) {
90+
91 return getDisassembler(Triple(str).getArch(), syntax);
92 }
93
94@@ -130,21 +134,20 @@
95 Valid(false),
96 HasSemantics(false),
97 ErrorStream(nulls()),
98- Key(key) {
99- const char *triple = tripleFromArch(key.Arch);
100-
101- if (!triple)
102+ Key(key),
103+ TgtTriple(key.Triple.c_str()) {
104+ if (TgtTriple.getArch() == Triple::InvalidArch)
105 return;
106
107- LLVMSyntaxVariant = getLLVMSyntaxVariant(key.Arch, key.Syntax);
108+ LLVMSyntaxVariant = getLLVMSyntaxVariant(TgtTriple.getArch(), key.Syntax);
109
110 if (LLVMSyntaxVariant < 0)
111 return;
112
113- std::string tripleString(triple);
114+ std::string tripleString(key.Triple);
115 std::string errorString;
116
117- Tgt = TargetRegistry::lookupTarget(tripleString,
118+ Tgt = TargetRegistry::lookupTarget(key.Triple,
119 errorString);
120
121 if (!Tgt)
122@@ -263,7 +266,7 @@
123 RegRMap[registerName] = registerIndex;
124 }
125
126- switch (Key.Arch) {
127+ switch (TgtTriple.getArch()) {
128 default:
129 break;
130 case Triple::x86:
131@@ -331,7 +334,7 @@
132 const std::string &str) {
133 int ret = 0;
134
135- switch (Key.Arch) {
136+ switch (TgtTriple.getArch()) {
137 default:
138 return -1;
139 case Triple::x86:
140@@ -356,8 +359,7 @@
141 context, *streamer,
142 *AsmInfo));
143
144- StringRef triple = tripleFromArch(Key.Arch);
145- OwningPtr<MCSubtargetInfo> STI(Tgt->createMCSubtargetInfo(triple, "", ""));
146+ OwningPtr<MCSubtargetInfo> STI(Tgt->createMCSubtargetInfo(Key.Triple.c_str(), "", ""));
147 OwningPtr<MCTargetAsmParser>
148 TargetParser(Tgt->createMCAsmParser(*STI, *genericParser));
149
150Index: lib/MC/MCDisassembler/EDDisassembler.h
151===================================================================
152--- lib/MC/MCDisassembler/EDDisassembler.h (revision 146622)
153+++ lib/MC/MCDisassembler/EDDisassembler.h (working copy)
154@@ -25,6 +25,7 @@
155
156 #include <map>
157 #include <set>
158+#include <string>
159 #include <vector>
160
161 namespace llvm {
162@@ -74,21 +75,21 @@
163 /// pair
164 struct CPUKey {
165 /// The architecture type
166- llvm::Triple::ArchType Arch;
167+ std::string Triple;
168
169 /// The assembly syntax
170 AssemblySyntax Syntax;
171
172 /// operator== - Equality operator
173 bool operator==(const CPUKey &key) const {
174- return (Arch == key.Arch &&
175+ return (Triple == key.Triple &&
176 Syntax == key.Syntax);
177 }
178
179 /// operator< - Less-than operator
180 bool operator<(const CPUKey &key) const {
181- return ((Arch < key.Arch) ||
182- ((Arch == key.Arch) && Syntax < (key.Syntax)));
183+ return ((Triple < key.Triple) ||
184+ ((Triple == key.Triple) && Syntax < (key.Syntax)));
185 }
186 };
187
188@@ -126,8 +127,10 @@
189 /// The stream to write errors to
190 llvm::raw_ostream &ErrorStream;
191
192- /// The architecture/syntax pair for the current architecture
193+ /// The triple/syntax pair for the current architecture
194 CPUKey Key;
195+ /// The Triple fur the current architecture
196+ Triple TgtTriple;
197 /// The LLVM target corresponding to the disassembler
198 const llvm::Target *Tgt;
199 /// The assembly information for the target architecture