1263320SdimPull in r198028 from upstream llvm trunk (by Venkatraman Govindaraju): 2263320Sdim 3263320Sdim [Sparc] Add MCInstPrinter implementation for SPARC. 4263320Sdim 5263320SdimIntroduced here: http://svn.freebsd.org/changeset/base/262261 6263320Sdim 7263320SdimIndex: lib/Target/Sparc/InstPrinter/LLVMBuild.txt 8263320Sdim=================================================================== 9263320Sdim--- lib/Target/Sparc/InstPrinter/LLVMBuild.txt 10263320Sdim+++ lib/Target/Sparc/InstPrinter/LLVMBuild.txt 11263320Sdim@@ -0,0 +1,23 @@ 12263320Sdim+;===- ./lib/Target/Sparc/InstPrinter/LLVMBuild.txt -------------*- Conf -*--===; 13263320Sdim+; 14263320Sdim+; The LLVM Compiler Infrastructure 15263320Sdim+; 16263320Sdim+; This file is distributed under the University of Illinois Open Source 17263320Sdim+; License. See LICENSE.TXT for details. 18263320Sdim+; 19263320Sdim+;===------------------------------------------------------------------------===; 20263320Sdim+; 21263320Sdim+; This is an LLVMBuild description file for the components in this subdirectory. 22263320Sdim+; 23263320Sdim+; For more information on the LLVMBuild system, please see: 24263320Sdim+; 25263320Sdim+; http://llvm.org/docs/LLVMBuild.html 26263320Sdim+; 27263320Sdim+;===------------------------------------------------------------------------===; 28263320Sdim+ 29263320Sdim+[component_0] 30263320Sdim+type = Library 31263320Sdim+name = SparcAsmPrinter 32263320Sdim+parent = Sparc 33263320Sdim+required_libraries = MC Support 34263320Sdim+add_to_library_groups = Sparc 35263320SdimIndex: lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp 36263320Sdim=================================================================== 37263320Sdim--- lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp 38263320Sdim+++ lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp 39263320Sdim@@ -0,0 +1,95 @@ 40263320Sdim+//===-- SparcInstPrinter.cpp - Convert Sparc MCInst to assembly syntax -----==// 41263320Sdim+// 42263320Sdim+// The LLVM Compiler Infrastructure 43263320Sdim+// 44263320Sdim+// This file is distributed under the University of Illinois Open Source 45263320Sdim+// License. See LICENSE.TXT for details. 46263320Sdim+// 47263320Sdim+//===----------------------------------------------------------------------===// 48263320Sdim+// 49263320Sdim+// This class prints an Sparc MCInst to a .s file. 50263320Sdim+// 51263320Sdim+//===----------------------------------------------------------------------===// 52263320Sdim+ 53263320Sdim+#define DEBUG_TYPE "asm-printer" 54263320Sdim+#include "SparcInstPrinter.h" 55263320Sdim+ 56263320Sdim+#include "Sparc.h" 57263320Sdim+#include "MCTargetDesc/SparcBaseInfo.h" 58263320Sdim+#include "llvm/MC/MCExpr.h" 59263320Sdim+#include "llvm/MC/MCInst.h" 60263320Sdim+#include "llvm/MC/MCSymbol.h" 61263320Sdim+#include "llvm/Support/raw_ostream.h" 62263320Sdim+using namespace llvm; 63263320Sdim+ 64263320Sdim+#define GET_INSTRUCTION_NAME 65263320Sdim+// Uncomment the following line once we are ready to use MCAsmWriter. 66263320Sdim+//#include "SparcGenAsmWriter.inc" 67263320Sdim+ 68263320Sdim+void SparcInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const 69263320Sdim+{ 70263320Sdim+ OS << '%' << StringRef(getRegisterName(RegNo)).lower(); 71263320Sdim+} 72263320Sdim+ 73263320Sdim+void SparcInstPrinter::printInst(const MCInst *MI, raw_ostream &O, 74263320Sdim+ StringRef Annot) 75263320Sdim+{ 76263320Sdim+ printInstruction(MI, O); 77263320Sdim+ printAnnotation(O, Annot); 78263320Sdim+} 79263320Sdim+ 80263320Sdim+void SparcInstPrinter::printOperand(const MCInst *MI, int opNum, 81263320Sdim+ raw_ostream &O) 82263320Sdim+{ 83263320Sdim+ const MCOperand &MO = MI->getOperand (opNum); 84263320Sdim+ 85263320Sdim+ if (MO.isReg()) { 86263320Sdim+ printRegName(O, MO.getReg()); 87263320Sdim+ return ; 88263320Sdim+ } 89263320Sdim+ 90263320Sdim+ if (MO.isImm()) { 91263320Sdim+ O << (int)MO.getImm(); 92263320Sdim+ return; 93263320Sdim+ } 94263320Sdim+ 95263320Sdim+ assert(MO.isExpr() && "Unknown operand kind in printOperand"); 96263320Sdim+ MO.getExpr()->print(O); 97263320Sdim+} 98263320Sdim+ 99263320Sdim+void SparcInstPrinter::printMemOperand(const MCInst *MI, int opNum, 100263320Sdim+ raw_ostream &O, const char *Modifier) 101263320Sdim+{ 102263320Sdim+ printOperand(MI, opNum, O); 103263320Sdim+ 104263320Sdim+ // If this is an ADD operand, emit it like normal operands. 105263320Sdim+ if (Modifier && !strcmp(Modifier, "arith")) { 106263320Sdim+ O << ", "; 107263320Sdim+ printOperand(MI, opNum+1, O); 108263320Sdim+ return; 109263320Sdim+ } 110263320Sdim+ const MCOperand &MO = MI->getOperand(opNum+1); 111263320Sdim+ 112263320Sdim+ if (MO.isReg() && MO.getReg() == SP::G0) 113263320Sdim+ return; // don't print "+%g0" 114263320Sdim+ if (MO.isImm() && MO.getImm() == 0) 115263320Sdim+ return; // don't print "+0" 116263320Sdim+ 117263320Sdim+ O << "+"; 118263320Sdim+ 119263320Sdim+ printOperand(MI, opNum+1, O); 120263320Sdim+} 121263320Sdim+ 122263320Sdim+void SparcInstPrinter::printCCOperand(const MCInst *MI, int opNum, 123263320Sdim+ raw_ostream &O) 124263320Sdim+{ 125263320Sdim+ int CC = (int)MI->getOperand(opNum).getImm(); 126263320Sdim+ O << SPARCCondCodeToString((SPCC::CondCodes)CC); 127263320Sdim+} 128263320Sdim+ 129263320Sdim+bool SparcInstPrinter::printGetPCX(const MCInst *MI, unsigned opNum, 130263320Sdim+ raw_ostream &O) 131263320Sdim+{ 132263320Sdim+ assert(0 && "FIXME: Implement SparcInstPrinter::printGetPCX."); 133263320Sdim+ return true; 134263320Sdim+} 135263320SdimIndex: lib/Target/Sparc/InstPrinter/CMakeLists.txt 136263320Sdim=================================================================== 137263320Sdim--- lib/Target/Sparc/InstPrinter/CMakeLists.txt 138263320Sdim+++ lib/Target/Sparc/InstPrinter/CMakeLists.txt 139263320Sdim@@ -0,0 +1,3 @@ 140263320Sdim+add_llvm_library(LLVMSparcAsmPrinter 141263320Sdim+ SparcInstPrinter.cpp 142263320Sdim+ ) 143263320SdimIndex: lib/Target/Sparc/InstPrinter/Makefile 144263320Sdim=================================================================== 145263320Sdim--- lib/Target/Sparc/InstPrinter/Makefile 146263320Sdim+++ lib/Target/Sparc/InstPrinter/Makefile 147263320Sdim@@ -0,0 +1,16 @@ 148263320Sdim+##===- lib/Target/Sparc/InstPrinter/Makefile ---------------*- Makefile -*-===## 149263320Sdim+# 150263320Sdim+# The LLVM Compiler Infrastructure 151263320Sdim+# 152263320Sdim+# This file is distributed under the University of Illinois Open Source 153263320Sdim+# License. See LICENSE.TXT for details. 154263320Sdim+# 155263320Sdim+##===----------------------------------------------------------------------===## 156263320Sdim+ 157263320Sdim+LEVEL = ../../../.. 158263320Sdim+LIBRARYNAME = LLVMSparcAsmPrinter 159263320Sdim+ 160263320Sdim+# Hack: we need to include 'main' target directory to grab private headers 161263320Sdim+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/.. 162263320Sdim+ 163263320Sdim+include $(LEVEL)/Makefile.common 164263320SdimIndex: lib/Target/Sparc/InstPrinter/SparcInstPrinter.h 165263320Sdim=================================================================== 166263320Sdim--- lib/Target/Sparc/InstPrinter/SparcInstPrinter.h 167263320Sdim+++ lib/Target/Sparc/InstPrinter/SparcInstPrinter.h 168263320Sdim@@ -0,0 +1,46 @@ 169263320Sdim+//===-- SparcInstPrinter.h - Convert Sparc MCInst to assembly syntax ------===// 170263320Sdim+// 171263320Sdim+// The LLVM Compiler Infrastructure 172263320Sdim+// 173263320Sdim+// This file is distributed under the University of Illinois Open Source 174263320Sdim+// License. See LICENSE.TXT for details. 175263320Sdim+// 176263320Sdim+//===----------------------------------------------------------------------===// 177263320Sdim+// 178263320Sdim+// This class prints an Sparc MCInst to a .s file. 179263320Sdim+// 180263320Sdim+//===----------------------------------------------------------------------===// 181263320Sdim+ 182263320Sdim+#ifndef SparcINSTPRINTER_H 183263320Sdim+#define SparcINSTPRINTER_H 184263320Sdim+ 185263320Sdim+#include "llvm/MC/MCInstPrinter.h" 186263320Sdim+ 187263320Sdim+namespace llvm { 188263320Sdim+ 189263320Sdim+class MCOperand; 190263320Sdim+ 191263320Sdim+class SparcInstPrinter : public MCInstPrinter { 192263320Sdim+public: 193263320Sdim+ SparcInstPrinter(const MCAsmInfo &MAI, 194263320Sdim+ const MCInstrInfo &MII, 195263320Sdim+ const MCRegisterInfo &MRI) 196263320Sdim+ : MCInstPrinter(MAI, MII, MRI) {} 197263320Sdim+ 198263320Sdim+ virtual void printRegName(raw_ostream &OS, unsigned RegNo) const; 199263320Sdim+ virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot); 200263320Sdim+ 201263320Sdim+ // Autogenerated by tblgen. 202263320Sdim+ void printInstruction(const MCInst *MI, raw_ostream &O); 203263320Sdim+ static const char *getRegisterName(unsigned RegNo); 204263320Sdim+ 205263320Sdim+ void printOperand(const MCInst *MI, int opNum, raw_ostream &OS); 206263320Sdim+ void printMemOperand(const MCInst *MI, int opNum, raw_ostream &OS, 207263320Sdim+ const char *Modifier = 0); 208263320Sdim+ void printCCOperand(const MCInst *MI, int opNum, raw_ostream &OS); 209263320Sdim+ bool printGetPCX(const MCInst *MI, unsigned OpNo, raw_ostream &OS); 210263320Sdim+ 211263320Sdim+}; 212263320Sdim+} // end namespace llvm 213263320Sdim+ 214263320Sdim+#endif 215263320SdimIndex: lib/Target/Sparc/LLVMBuild.txt 216263320Sdim=================================================================== 217263320Sdim--- lib/Target/Sparc/LLVMBuild.txt 218263320Sdim+++ lib/Target/Sparc/LLVMBuild.txt 219263320Sdim@@ -16,7 +16,7 @@ 220263320Sdim ;===------------------------------------------------------------------------===; 221263320Sdim 222263320Sdim [common] 223263320Sdim-subdirectories = MCTargetDesc TargetInfo 224263320Sdim+subdirectories = InstPrinter MCTargetDesc TargetInfo 225263320Sdim 226263320Sdim [component_0] 227263320Sdim type = TargetGroup 228263320Sdim@@ -29,6 +29,6 @@ has_jit = 1 229263320Sdim type = Library 230263320Sdim name = SparcCodeGen 231263320Sdim parent = Sparc 232263320Sdim-required_libraries = AsmPrinter CodeGen Core MC SelectionDAG SparcDesc 233263320Sdim- SparcInfo Support Target 234263320Sdim+required_libraries = AsmPrinter CodeGen Core MC SelectionDAG SparcAsmPrinter 235263320Sdim+ SparcDesc SparcInfo Support Target 236263320Sdim add_to_library_groups = Sparc 237263320SdimIndex: lib/Target/Sparc/CMakeLists.txt 238263320Sdim=================================================================== 239263320Sdim--- lib/Target/Sparc/CMakeLists.txt 240263320Sdim+++ lib/Target/Sparc/CMakeLists.txt 241263320Sdim@@ -29,3 +29,4 @@ add_dependencies(LLVMSparcCodeGen SparcCommonTable 242263320Sdim 243263320Sdim add_subdirectory(TargetInfo) 244263320Sdim add_subdirectory(MCTargetDesc) 245263320Sdim+add_subdirectory(InstPrinter) 246263320SdimIndex: lib/Target/Sparc/Makefile 247263320Sdim=================================================================== 248263320Sdim--- lib/Target/Sparc/Makefile 249263320Sdim+++ lib/Target/Sparc/Makefile 250263320Sdim@@ -17,7 +17,7 @@ BUILT_SOURCES = SparcGenRegisterInfo.inc SparcGenI 251263320Sdim SparcGenSubtargetInfo.inc SparcGenCallingConv.inc \ 252263320Sdim SparcGenCodeEmitter.inc 253263320Sdim 254263320Sdim-DIRS = TargetInfo MCTargetDesc 255263320Sdim+DIRS = InstPrinter TargetInfo MCTargetDesc 256263320Sdim 257263320Sdim include $(LEVEL)/Makefile.common 258263320Sdim 259