mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
Don't crash if there is no Inst class in the tablegen file!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7402 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
92aa8ca9c5
commit
30709543d2
@ -2,7 +2,7 @@
|
||||
#include "Record.h"
|
||||
#include "CodeEmitterGen.h"
|
||||
|
||||
void CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
int CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
std::vector<Record*> Insts;
|
||||
|
||||
const std::map<std::string, Record*> &Defs = Records.getDefs();
|
||||
@ -31,8 +31,12 @@ void CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
<< " DEBUG(std::cerr << \"Emitting " << R->getName() << "\\n\");\n";
|
||||
|
||||
const RecordVal *InstVal = R->getValue("Inst");
|
||||
Init *InitVal = InstVal->getValue();
|
||||
if (!InstVal) {
|
||||
std::cerr << "No 'Inst' record found in target description file!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Init *InitVal = InstVal->getValue();
|
||||
assert(dynamic_cast<BitsInit*>(InitVal) &&
|
||||
"Can only handle undefined bits<> types!");
|
||||
BitsInit *BI = (BitsInit*)InitVal;
|
||||
@ -225,4 +229,5 @@ void CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
<< " }\n"
|
||||
<< " return Value;\n"
|
||||
<< "}\n";
|
||||
return 0;
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ struct CodeEmitterGen {
|
||||
public:
|
||||
CodeEmitterGen(RecordKeeper &R) : Records(R) {}
|
||||
|
||||
void createEmitter(std::ostream &o);
|
||||
int createEmitter(std::ostream &o);
|
||||
void emitMachineOpEmitter(std::ostream &o, const std::string &Namespace);
|
||||
void emitGetValueBit(std::ostream &o, const std::string &Namespace);
|
||||
};
|
||||
|
@ -394,10 +394,12 @@ int main(int argc, char **argv) {
|
||||
RemoveFileOnSignal(OutputFilename);
|
||||
}
|
||||
|
||||
int ErrorCode = 0;
|
||||
|
||||
switch (Action) {
|
||||
case Parse: ParseMachineCode(); break;
|
||||
case GenEmitter:
|
||||
CodeEmitterGen(Records).createEmitter(*Out);
|
||||
ErrorCode = CodeEmitterGen(Records).createEmitter(*Out);
|
||||
break;
|
||||
case PrintRecords:
|
||||
*Out << Records; // No argument, dump all contents
|
||||
@ -421,5 +423,5 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
if (Out != &std::cout) delete Out;
|
||||
return 0;
|
||||
return ErrorCode;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include "Record.h"
|
||||
#include "CodeEmitterGen.h"
|
||||
|
||||
void CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
int CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
std::vector<Record*> Insts;
|
||||
|
||||
const std::map<std::string, Record*> &Defs = Records.getDefs();
|
||||
@ -31,8 +31,12 @@ void CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
<< " DEBUG(std::cerr << \"Emitting " << R->getName() << "\\n\");\n";
|
||||
|
||||
const RecordVal *InstVal = R->getValue("Inst");
|
||||
Init *InitVal = InstVal->getValue();
|
||||
if (!InstVal) {
|
||||
std::cerr << "No 'Inst' record found in target description file!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Init *InitVal = InstVal->getValue();
|
||||
assert(dynamic_cast<BitsInit*>(InitVal) &&
|
||||
"Can only handle undefined bits<> types!");
|
||||
BitsInit *BI = (BitsInit*)InitVal;
|
||||
@ -225,4 +229,5 @@ void CodeEmitterGen::createEmitter(std::ostream &o) {
|
||||
<< " }\n"
|
||||
<< " return Value;\n"
|
||||
<< "}\n";
|
||||
return 0;
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ struct CodeEmitterGen {
|
||||
public:
|
||||
CodeEmitterGen(RecordKeeper &R) : Records(R) {}
|
||||
|
||||
void createEmitter(std::ostream &o);
|
||||
int createEmitter(std::ostream &o);
|
||||
void emitMachineOpEmitter(std::ostream &o, const std::string &Namespace);
|
||||
void emitGetValueBit(std::ostream &o, const std::string &Namespace);
|
||||
};
|
||||
|
@ -394,10 +394,12 @@ int main(int argc, char **argv) {
|
||||
RemoveFileOnSignal(OutputFilename);
|
||||
}
|
||||
|
||||
int ErrorCode = 0;
|
||||
|
||||
switch (Action) {
|
||||
case Parse: ParseMachineCode(); break;
|
||||
case GenEmitter:
|
||||
CodeEmitterGen(Records).createEmitter(*Out);
|
||||
ErrorCode = CodeEmitterGen(Records).createEmitter(*Out);
|
||||
break;
|
||||
case PrintRecords:
|
||||
*Out << Records; // No argument, dump all contents
|
||||
@ -421,5 +423,5 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
if (Out != &std::cout) delete Out;
|
||||
return 0;
|
||||
return ErrorCode;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user