Exemplo n.º 1
0
int build_reg_table() {
	std::string buf;
	llvm::StringRef reg_name;
	int n;
	int tmp;

	MCInst *inst = new MCInst;

	LLVMSymbolLookupCallback SymbolLookUp = NULL;

	std::string TripleName = "x86_64-pc-linux-gnu";
	// Get the target.
	std::string Error;
	//TargetRegistry::printRegisteredTargetsForVersion();
	const llvm::Target *TheTarget = llvm::TargetRegistry::lookupTarget(TripleName, Error);
	if (!TheTarget)
		return 1;

	//outs() << TheTarget;

	const MCRegisterInfo *MRI = TheTarget->createMCRegInfo(TripleName);
	if (!MRI)
		return 2;

	// Get the assembler info needed to setup the MCContext.
	const MCAsmInfo *MAI = TheTarget->createMCAsmInfo(*MRI, TripleName);
	if (!MAI)
		return 3;

	const MCInstrInfo *MII = TheTarget->createMCInstrInfo();
	if (!MII)
		return 4;

	tmp = MII->getNumOpcodes();
	//outs() << format("Number of opcodes = 0x%x\n", tmp);

	// Package up features to be passed to target/subtarget
	std::string FeaturesStr;
	std::string CPU;

	const MCSubtargetInfo *STI = TheTarget->createMCSubtargetInfo(TripleName, CPU,
                                                                FeaturesStr);
	if (!STI)
		return 5;

	// Set up the MCContext for creating symbols and MCExpr's.
	MCContext *Ctx = new MCContext(MAI, MRI, 0);
	if (!Ctx)
		return 6;

	// Set up disassembler.
	MCDisassembler *DisAsm = TheTarget->createMCDisassembler(*STI);
	if (!DisAsm)
		return 7;

	OwningPtr<MCRelocationInfo> RelInfo(
		TheTarget->createMCRelocationInfo(TripleName, *Ctx));
	if (!RelInfo)
		return 8;

	LLVMOpInfoCallback GetOpInfo = NULL;
	void *DisInfo = NULL;
	OwningPtr<MCSymbolizer> Symbolizer(
		TheTarget->createMCSymbolizer(TripleName, GetOpInfo, SymbolLookUp, DisInfo,
			Ctx, RelInfo.take()));
	//DisAsm->setSymbolizer(Symbolizer);
	//DisAsm->setupForSymbolicDisassembly(GetOpInfo, SymbolLookUp, DisInfo, Ctx, RelInfo);

	// Set up the instruction printer.
	int AsmPrinterVariant = MAI->getAssemblerDialect();
	MCInstPrinter *IP = TheTarget->createMCInstPrinter(AsmPrinterVariant,
                                                     *MAI, *MII, *MRI, *STI);
	if (!IP)
		return 9;

	llvm::raw_string_ostream OS(buf);
	OS.SetUnbuffered();
	for (n = 1; n < 233; n++) {
		buf.clear();  /* Clears the OS2 buffer */
		IP->printRegName(OS, n);
		reg_name = OS.str();
		llvm::outs() << llvm::format("Reg:0x%x:", n);
		llvm::outs() << reg_name << "\n";
	}
	return 0;
}