2014-03-18 22:07:45 +00:00
|
|
|
Pull in r198028 from upstream llvm trunk (by Venkatraman Govindaraju):
|
|
|
|
|
|
|
|
[Sparc] Add MCInstPrinter implementation for SPARC.
|
|
|
|
|
2014-05-24 22:27:31 +00:00
|
|
|
Introduced here: http://svnweb.freebsd.org/changeset/base/262261
|
2014-03-18 22:07:45 +00:00
|
|
|
|
|
|
|
Index: lib/Target/Sparc/InstPrinter/LLVMBuild.txt
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/InstPrinter/LLVMBuild.txt
|
|
|
|
+++ lib/Target/Sparc/InstPrinter/LLVMBuild.txt
|
|
|
|
@@ -0,0 +1,23 @@
|
|
|
|
+;===- ./lib/Target/Sparc/InstPrinter/LLVMBuild.txt -------------*- Conf -*--===;
|
|
|
|
+;
|
|
|
|
+; The LLVM Compiler Infrastructure
|
|
|
|
+;
|
|
|
|
+; This file is distributed under the University of Illinois Open Source
|
|
|
|
+; License. See LICENSE.TXT for details.
|
|
|
|
+;
|
|
|
|
+;===------------------------------------------------------------------------===;
|
|
|
|
+;
|
|
|
|
+; This is an LLVMBuild description file for the components in this subdirectory.
|
|
|
|
+;
|
|
|
|
+; For more information on the LLVMBuild system, please see:
|
|
|
|
+;
|
|
|
|
+; http://llvm.org/docs/LLVMBuild.html
|
|
|
|
+;
|
|
|
|
+;===------------------------------------------------------------------------===;
|
|
|
|
+
|
|
|
|
+[component_0]
|
|
|
|
+type = Library
|
|
|
|
+name = SparcAsmPrinter
|
|
|
|
+parent = Sparc
|
|
|
|
+required_libraries = MC Support
|
|
|
|
+add_to_library_groups = Sparc
|
|
|
|
Index: lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp
|
|
|
|
+++ lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp
|
|
|
|
@@ -0,0 +1,95 @@
|
|
|
|
+//===-- SparcInstPrinter.cpp - Convert Sparc 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 Sparc MCInst to a .s file.
|
|
|
|
+//
|
|
|
|
+//===----------------------------------------------------------------------===//
|
|
|
|
+
|
|
|
|
+#define DEBUG_TYPE "asm-printer"
|
|
|
|
+#include "SparcInstPrinter.h"
|
|
|
|
+
|
|
|
|
+#include "Sparc.h"
|
|
|
|
+#include "MCTargetDesc/SparcBaseInfo.h"
|
|
|
|
+#include "llvm/MC/MCExpr.h"
|
|
|
|
+#include "llvm/MC/MCInst.h"
|
|
|
|
+#include "llvm/MC/MCSymbol.h"
|
|
|
|
+#include "llvm/Support/raw_ostream.h"
|
|
|
|
+using namespace llvm;
|
|
|
|
+
|
|
|
|
+#define GET_INSTRUCTION_NAME
|
|
|
|
+// Uncomment the following line once we are ready to use MCAsmWriter.
|
|
|
|
+//#include "SparcGenAsmWriter.inc"
|
|
|
|
+
|
|
|
|
+void SparcInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const
|
|
|
|
+{
|
|
|
|
+ OS << '%' << StringRef(getRegisterName(RegNo)).lower();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void SparcInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
|
|
|
|
+ StringRef Annot)
|
|
|
|
+{
|
|
|
|
+ printInstruction(MI, O);
|
|
|
|
+ printAnnotation(O, Annot);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void SparcInstPrinter::printOperand(const MCInst *MI, int opNum,
|
|
|
|
+ raw_ostream &O)
|
|
|
|
+{
|
|
|
|
+ const MCOperand &MO = MI->getOperand (opNum);
|
|
|
|
+
|
|
|
|
+ if (MO.isReg()) {
|
|
|
|
+ printRegName(O, MO.getReg());
|
|
|
|
+ return ;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (MO.isImm()) {
|
|
|
|
+ O << (int)MO.getImm();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ assert(MO.isExpr() && "Unknown operand kind in printOperand");
|
|
|
|
+ MO.getExpr()->print(O);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void SparcInstPrinter::printMemOperand(const MCInst *MI, int opNum,
|
|
|
|
+ raw_ostream &O, const char *Modifier)
|
|
|
|
+{
|
|
|
|
+ printOperand(MI, opNum, O);
|
|
|
|
+
|
|
|
|
+ // If this is an ADD operand, emit it like normal operands.
|
|
|
|
+ if (Modifier && !strcmp(Modifier, "arith")) {
|
|
|
|
+ O << ", ";
|
|
|
|
+ printOperand(MI, opNum+1, O);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ const MCOperand &MO = MI->getOperand(opNum+1);
|
|
|
|
+
|
|
|
|
+ if (MO.isReg() && MO.getReg() == SP::G0)
|
|
|
|
+ return; // don't print "+%g0"
|
|
|
|
+ if (MO.isImm() && MO.getImm() == 0)
|
|
|
|
+ return; // don't print "+0"
|
|
|
|
+
|
|
|
|
+ O << "+";
|
|
|
|
+
|
|
|
|
+ printOperand(MI, opNum+1, O);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void SparcInstPrinter::printCCOperand(const MCInst *MI, int opNum,
|
|
|
|
+ raw_ostream &O)
|
|
|
|
+{
|
|
|
|
+ int CC = (int)MI->getOperand(opNum).getImm();
|
|
|
|
+ O << SPARCCondCodeToString((SPCC::CondCodes)CC);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool SparcInstPrinter::printGetPCX(const MCInst *MI, unsigned opNum,
|
|
|
|
+ raw_ostream &O)
|
|
|
|
+{
|
|
|
|
+ assert(0 && "FIXME: Implement SparcInstPrinter::printGetPCX.");
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
Index: lib/Target/Sparc/InstPrinter/CMakeLists.txt
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/InstPrinter/CMakeLists.txt
|
|
|
|
+++ lib/Target/Sparc/InstPrinter/CMakeLists.txt
|
|
|
|
@@ -0,0 +1,3 @@
|
|
|
|
+add_llvm_library(LLVMSparcAsmPrinter
|
|
|
|
+ SparcInstPrinter.cpp
|
|
|
|
+ )
|
|
|
|
Index: lib/Target/Sparc/InstPrinter/Makefile
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/InstPrinter/Makefile
|
|
|
|
+++ lib/Target/Sparc/InstPrinter/Makefile
|
|
|
|
@@ -0,0 +1,16 @@
|
|
|
|
+##===- lib/Target/Sparc/InstPrinter/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 = LLVMSparcAsmPrinter
|
|
|
|
+
|
|
|
|
+# Hack: we need to include 'main' target directory to grab private headers
|
|
|
|
+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
|
|
|
|
+
|
|
|
|
+include $(LEVEL)/Makefile.common
|
|
|
|
Index: lib/Target/Sparc/InstPrinter/SparcInstPrinter.h
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/InstPrinter/SparcInstPrinter.h
|
|
|
|
+++ lib/Target/Sparc/InstPrinter/SparcInstPrinter.h
|
|
|
|
@@ -0,0 +1,46 @@
|
|
|
|
+//===-- SparcInstPrinter.h - Convert Sparc 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 Sparc MCInst to a .s file.
|
|
|
|
+//
|
|
|
|
+//===----------------------------------------------------------------------===//
|
|
|
|
+
|
|
|
|
+#ifndef SparcINSTPRINTER_H
|
|
|
|
+#define SparcINSTPRINTER_H
|
|
|
|
+
|
|
|
|
+#include "llvm/MC/MCInstPrinter.h"
|
|
|
|
+
|
|
|
|
+namespace llvm {
|
|
|
|
+
|
|
|
|
+class MCOperand;
|
|
|
|
+
|
|
|
|
+class SparcInstPrinter : public MCInstPrinter {
|
|
|
|
+public:
|
|
|
|
+ SparcInstPrinter(const MCAsmInfo &MAI,
|
|
|
|
+ const MCInstrInfo &MII,
|
|
|
|
+ const MCRegisterInfo &MRI)
|
|
|
|
+ : MCInstPrinter(MAI, MII, MRI) {}
|
|
|
|
+
|
|
|
|
+ virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
|
|
|
|
+ virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot);
|
|
|
|
+
|
|
|
|
+ // Autogenerated by tblgen.
|
|
|
|
+ void printInstruction(const MCInst *MI, raw_ostream &O);
|
|
|
|
+ static const char *getRegisterName(unsigned RegNo);
|
|
|
|
+
|
|
|
|
+ void printOperand(const MCInst *MI, int opNum, raw_ostream &OS);
|
|
|
|
+ void printMemOperand(const MCInst *MI, int opNum, raw_ostream &OS,
|
|
|
|
+ const char *Modifier = 0);
|
|
|
|
+ void printCCOperand(const MCInst *MI, int opNum, raw_ostream &OS);
|
|
|
|
+ bool printGetPCX(const MCInst *MI, unsigned OpNo, raw_ostream &OS);
|
|
|
|
+
|
|
|
|
+};
|
|
|
|
+} // end namespace llvm
|
|
|
|
+
|
|
|
|
+#endif
|
|
|
|
Index: lib/Target/Sparc/LLVMBuild.txt
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/LLVMBuild.txt
|
|
|
|
+++ lib/Target/Sparc/LLVMBuild.txt
|
|
|
|
@@ -16,7 +16,7 @@
|
|
|
|
;===------------------------------------------------------------------------===;
|
|
|
|
|
|
|
|
[common]
|
|
|
|
-subdirectories = MCTargetDesc TargetInfo
|
|
|
|
+subdirectories = InstPrinter MCTargetDesc TargetInfo
|
|
|
|
|
|
|
|
[component_0]
|
|
|
|
type = TargetGroup
|
|
|
|
@@ -29,6 +29,6 @@ has_jit = 1
|
|
|
|
type = Library
|
|
|
|
name = SparcCodeGen
|
|
|
|
parent = Sparc
|
|
|
|
-required_libraries = AsmPrinter CodeGen Core MC SelectionDAG SparcDesc
|
|
|
|
- SparcInfo Support Target
|
|
|
|
+required_libraries = AsmPrinter CodeGen Core MC SelectionDAG SparcAsmPrinter
|
|
|
|
+ SparcDesc SparcInfo Support Target
|
|
|
|
add_to_library_groups = Sparc
|
|
|
|
Index: lib/Target/Sparc/CMakeLists.txt
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/CMakeLists.txt
|
|
|
|
+++ lib/Target/Sparc/CMakeLists.txt
|
|
|
|
@@ -29,3 +29,4 @@ add_dependencies(LLVMSparcCodeGen SparcCommonTable
|
|
|
|
|
|
|
|
add_subdirectory(TargetInfo)
|
|
|
|
add_subdirectory(MCTargetDesc)
|
|
|
|
+add_subdirectory(InstPrinter)
|
|
|
|
Index: lib/Target/Sparc/Makefile
|
|
|
|
===================================================================
|
|
|
|
--- lib/Target/Sparc/Makefile
|
|
|
|
+++ lib/Target/Sparc/Makefile
|
|
|
|
@@ -17,7 +17,7 @@ BUILT_SOURCES = SparcGenRegisterInfo.inc SparcGenI
|
|
|
|
SparcGenSubtargetInfo.inc SparcGenCallingConv.inc \
|
|
|
|
SparcGenCodeEmitter.inc
|
|
|
|
|
|
|
|
-DIRS = TargetInfo MCTargetDesc
|
|
|
|
+DIRS = InstPrinter TargetInfo MCTargetDesc
|
|
|
|
|
|
|
|
include $(LEVEL)/Makefile.common
|
|
|
|
|