mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Remove the assert()'s from the LLVMCreateDisasmCPU() library API and just
return 0 to indicate failure to create the disassembler. A library routine should not assert and just let the caller handler the error. For example darwin's otool(1) will simply print an error if it ends up using a library that is not configured for a target it wants: % otool -tv ViewController.o ViewController.o: (__TEXT,__text) section can't create arm llvm disassembler This is much better than an abort which appears as a crash to the user or even the assert when using a Debug+Asserts built library: Assertion failed: (MAI && "Unable to create target asm info!"), function LLVMCreateDisasmCPU, file /Volumes/SandBox/llvm/lib/MC/MCDisassembler/Disassembler.cpp, line 47. radr://12539918 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176880 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8f8af529fc
commit
2ee69f1be6
@ -44,41 +44,49 @@ LLVMDisasmContextRef LLVMCreateDisasmCPU(const char *Triple, const char *CPU,
|
||||
|
||||
// Get the assembler info needed to setup the MCContext.
|
||||
const MCAsmInfo *MAI = TheTarget->createMCAsmInfo(Triple);
|
||||
assert(MAI && "Unable to create target asm info!");
|
||||
if (!MAI)
|
||||
return 0;
|
||||
|
||||
const MCInstrInfo *MII = TheTarget->createMCInstrInfo();
|
||||
assert(MII && "Unable to create target instruction info!");
|
||||
if (!MII)
|
||||
return 0;
|
||||
|
||||
const MCRegisterInfo *MRI = TheTarget->createMCRegInfo(Triple);
|
||||
assert(MRI && "Unable to create target register info!");
|
||||
if (!MRI)
|
||||
return 0;
|
||||
|
||||
// Package up features to be passed to target/subtarget
|
||||
std::string FeaturesStr;
|
||||
|
||||
const MCSubtargetInfo *STI = TheTarget->createMCSubtargetInfo(Triple, CPU,
|
||||
FeaturesStr);
|
||||
assert(STI && "Unable to create subtarget info!");
|
||||
if (!STI)
|
||||
return 0;
|
||||
|
||||
// Set up the MCContext for creating symbols and MCExpr's.
|
||||
MCContext *Ctx = new MCContext(*MAI, *MRI, 0);
|
||||
assert(Ctx && "Unable to create MCContext!");
|
||||
if (!Ctx)
|
||||
return 0;
|
||||
|
||||
// Set up disassembler.
|
||||
MCDisassembler *DisAsm = TheTarget->createMCDisassembler(*STI);
|
||||
assert(DisAsm && "Unable to create disassembler!");
|
||||
if (!DisAsm)
|
||||
return 0;
|
||||
DisAsm->setupForSymbolicDisassembly(GetOpInfo, SymbolLookUp, DisInfo, Ctx);
|
||||
|
||||
// Set up the instruction printer.
|
||||
int AsmPrinterVariant = MAI->getAssemblerDialect();
|
||||
MCInstPrinter *IP = TheTarget->createMCInstPrinter(AsmPrinterVariant,
|
||||
*MAI, *MII, *MRI, *STI);
|
||||
assert(IP && "Unable to create instruction printer!");
|
||||
if (!IP)
|
||||
return 0;
|
||||
|
||||
LLVMDisasmContext *DC = new LLVMDisasmContext(Triple, DisInfo, TagType,
|
||||
GetOpInfo, SymbolLookUp,
|
||||
TheTarget, MAI, MRI,
|
||||
STI, MII, Ctx, DisAsm, IP);
|
||||
assert(DC && "Allocation failure!");
|
||||
if (!DC)
|
||||
return 0;
|
||||
|
||||
return DC;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user