diff --git a/lib/Target/ARM/InstPrinter/ARMInstPrinter.h b/lib/Target/ARM/InstPrinter/ARMInstPrinter.h index 1a36f4830a0..e69a0e0d8f7 100644 --- a/lib/Target/ARM/InstPrinter/ARMInstPrinter.h +++ b/lib/Target/ARM/InstPrinter/ARMInstPrinter.h @@ -107,6 +107,6 @@ public: void printPCLabel(const MCInst *MI, unsigned OpNum, raw_ostream &O); }; -} +} // end namespace llvm #endif diff --git a/lib/Target/PowerPC/InstPrinter/CMakeLists.txt b/lib/Target/PowerPC/InstPrinter/CMakeLists.txt new file mode 100644 index 00000000000..389ea7742b0 --- /dev/null +++ b/lib/Target/PowerPC/InstPrinter/CMakeLists.txt @@ -0,0 +1,6 @@ +include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. ) + +add_llvm_library(LLVMPowerPCAsmPrinter + PPCInstPrinter.cpp + ) +add_dependencies(LLVMPowerPCAsmPrinter PowerPCCodeGenTable_gen) diff --git a/lib/Target/PowerPC/InstPrinter/Makefile b/lib/Target/PowerPC/InstPrinter/Makefile new file mode 100644 index 00000000000..f097e84248f --- /dev/null +++ b/lib/Target/PowerPC/InstPrinter/Makefile @@ -0,0 +1,16 @@ +##===- lib/Target/PowerPC/AsmPrinter/Makefile --------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../../../.. +LIBRARYNAME = LLVMPowerPCAsmPrinter + +# Hack: we need to include 'main' powerpc target directory to grab private headers +CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/.. + +include $(LEVEL)/Makefile.common diff --git a/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp new file mode 100644 index 00000000000..adb93f2b7f4 --- /dev/null +++ b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp @@ -0,0 +1,41 @@ +//===-- PPCInstPrinter.cpp - Convert PPC MCInst to assembly syntax --------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This class prints an PPC MCInst to a .s file. +// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "asm-printer" +#include "PPCInstPrinter.h" +#include "llvm/MC/MCInst.h" +//#include "llvm/MC/MCAsmInfo.h" +//#include "llvm/MC/MCExpr.h" +//#include "llvm/ADT/StringExtras.h" +#include "llvm/Support/raw_ostream.h" + +#include "PPCGenRegisterNames.inc" +#include "PPCGenInstrNames.inc" +using namespace llvm; + +#define GET_INSTRUCTION_NAME +#define PPCAsmPrinter PPCInstPrinter +#define MachineInstr MCInst +#include "PPCGenAsmWriter.inc" + +StringRef PPCInstPrinter::getOpcodeName(unsigned Opcode) const { + return getInstructionName(Opcode); +} + + +void PPCInstPrinter::printInst(const MCInst *MI, raw_ostream &O) { + // TODO: pseudo ops. + + printInstruction(MI, O); +} + diff --git a/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h new file mode 100644 index 00000000000..1c59e5f09c0 --- /dev/null +++ b/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h @@ -0,0 +1,67 @@ +//===-- PPCInstPrinter.h - Convert PPC MCInst to assembly syntax ----------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This class prints an PPC MCInst to a .s file. +// +//===----------------------------------------------------------------------===// + +#ifndef PPCINSTPRINTER_H +#define PPCINSTPRINTER_H + +#include "llvm/MC/MCInstPrinter.h" + +namespace llvm { + class MCOperand; + +class PPCInstPrinter : public MCInstPrinter { +public: + PPCInstPrinter(const MCAsmInfo &MAI) : MCInstPrinter(MAI) {} + + virtual void printInst(const MCInst *MI, raw_ostream &O); + virtual StringRef getOpcodeName(unsigned Opcode) const; + + static const char *getInstructionName(unsigned Opcode); + + // Autogenerated by tblgen. + void printInstruction(const MCInst *MI, raw_ostream &O); + static const char *getRegisterName(unsigned RegNo); + + + void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printPredicateOperand(const MCInst *MI, unsigned OpNo, + raw_ostream &O, const char *Modifier) {} + + + void printS5ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printU5ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printU6ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printS16ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printU16ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printS16X4ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printBranchOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printCallOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printAbsAddrOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + + void printcrbitm(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + + void printMemRegImm(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printMemRegImmShifted(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printMemRegReg(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + + // FIXME: Remove + void PrintSpecial(const MCInst *MI, raw_ostream &O, const char *Modifier) {} + void printSymbolLo(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printSymbolHi(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printPICLabel(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + void printTOCEntryLabel(const MCInst *MI, unsigned OpNo, raw_ostream &O) {} + +}; +} // end namespace llvm + +#endif diff --git a/lib/Target/PowerPC/Makefile b/lib/Target/PowerPC/Makefile index addcf498344..484aa9849e9 100644 --- a/lib/Target/PowerPC/Makefile +++ b/lib/Target/PowerPC/Makefile @@ -18,6 +18,6 @@ BUILT_SOURCES = PPCGenInstrNames.inc PPCGenRegisterNames.inc \ PPCGenInstrInfo.inc PPCGenDAGISel.inc \ PPCGenSubtarget.inc PPCGenCallingConv.inc -DIRS = TargetInfo +DIRS = InstPrinter TargetInfo include $(LEVEL)/Makefile.common diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index c05a6400170..833a83ede62 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -50,6 +50,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/ADT/SmallString.h" +#include "InstPrinter/PPCInstPrinter.h" using namespace llvm; namespace { @@ -911,8 +912,20 @@ static AsmPrinter *createPPCAsmPrinterPass(TargetMachine &tm, return new PPCLinuxAsmPrinter(tm, Streamer); } +static MCInstPrinter *createPPCMCInstPrinter(const Target &T, + unsigned SyntaxVariant, + const MCAsmInfo &MAI) { + if (SyntaxVariant == 0) + return new PPCInstPrinter(MAI); + return 0; +} + + // Force static initialization. extern "C" void LLVMInitializePowerPCAsmPrinter() { TargetRegistry::RegisterAsmPrinter(ThePPC32Target, createPPCAsmPrinterPass); TargetRegistry::RegisterAsmPrinter(ThePPC64Target, createPPCAsmPrinterPass); + + TargetRegistry::RegisterMCInstPrinter(ThePPC32Target, createPPCMCInstPrinter); + TargetRegistry::RegisterMCInstPrinter(ThePPC32Target, createPPCMCInstPrinter); }