From 2685a29a8d4ced7791bb671e28f9fe51c74eb3bb Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Tue, 20 Oct 2009 05:15:36 +0000 Subject: [PATCH] Wire up the ARM MCInst printer, for llvm-mc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84600 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetRegistry.h | 11 +++++++- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 11 +++++++- lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp | 30 ++++++++++++++++----- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/include/llvm/Target/TargetRegistry.h b/include/llvm/Target/TargetRegistry.h index 8042d236367..395526fa394 100644 --- a/include/llvm/Target/TargetRegistry.h +++ b/include/llvm/Target/TargetRegistry.h @@ -387,6 +387,15 @@ namespace llvm { T.MCDisassemblerCtorFn = Fn; } + /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the + /// given target. + /// + /// Clients are responsible for ensuring that registration doesn't occur + /// while another thread is attempting to access the registry. Typically + /// this is done by initializing all targets at program startup. + /// + /// @param T - The target being registered. + /// @param Fn - A function to construct an MCInstPrinter for the target. static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn) { if (!T.MCInstPrinterCtorFn) @@ -395,7 +404,7 @@ namespace llvm { /// RegisterCodeEmitter - Register a MCCodeEmitter implementation for the /// given target. - /// + /// /// Clients are responsible for ensuring that registration doesn't occur /// while another thread is attempting to access the registry. Typically /// this is done by initializing all targets at program startup. diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 01487c29a69..403f96c69e5 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -534,8 +534,17 @@ bool ARMAsmParser::MatchInstruction(SmallVectorImpl &Operands, Mnemonic == "bl" || Mnemonic == "push" || Mnemonic == "blx" || - Mnemonic == "pop") + Mnemonic == "pop") { + // Hard-coded to a valid instruction, till we have a real matcher. + Inst = MCInst(); + Inst.setOpcode(ARM::MOVr); + Inst.addOperand(MCOperand::CreateReg(2)); + Inst.addOperand(MCOperand::CreateReg(2)); + Inst.addOperand(MCOperand::CreateImm(0)); + Inst.addOperand(MCOperand::CreateImm(0)); + Inst.addOperand(MCOperand::CreateReg(0)); return false; + } return true; } diff --git a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index 66cc6f36745..6ed7e8e4cf4 100644 --- a/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -1301,13 +1301,6 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) { } } -// Force static initialization. -extern "C" void LLVMInitializeARMAsmPrinter() { - RegisterAsmPrinter X(TheARMTarget); - RegisterAsmPrinter Y(TheThumbTarget); -} - - //===----------------------------------------------------------------------===// void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) { @@ -1457,3 +1450,26 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) { printMCInst(&TmpInst); } + +//===----------------------------------------------------------------------===// +// Target Registry Stuff +//===----------------------------------------------------------------------===// + +static MCInstPrinter *createARMMCInstPrinter(const Target &T, + unsigned SyntaxVariant, + const MCAsmInfo &MAI, + raw_ostream &O) { + if (SyntaxVariant == 0) + return new ARMInstPrinter(O, MAI, false); + return 0; +} + +// Force static initialization. +extern "C" void LLVMInitializeARMAsmPrinter() { + RegisterAsmPrinter X(TheARMTarget); + RegisterAsmPrinter Y(TheThumbTarget); + + TargetRegistry::RegisterMCInstPrinter(TheARMTarget, createARMMCInstPrinter); + TargetRegistry::RegisterMCInstPrinter(TheThumbTarget, createARMMCInstPrinter); +} +