SystemZAsmPrinter.cpp revision 1c831f7f1f7e869516f5a70c1e6dd8896bef76f5
11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZAsmPrinter.cpp - SystemZ LLVM assembly printer -------------===// 21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// The LLVM Compiler Infrastructure 41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source 61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details. 71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===// 91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Streams SystemZ assembly language and associated data, in the form of 111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// MCInsts and MCExprs respectively. 121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===// 141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZAsmPrinter.h" 161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "InstPrinter/SystemZInstPrinter.h" 171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZConstantPoolValue.h" 181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZMCInstLower.h" 191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/MachineModuleInfoImpls.h" 201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCExpr.h" 229f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford#include "llvm/MC/MCInstBuilder.h" 231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCStreamer.h" 241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Support/TargetRegistry.h" 251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Target/Mangler.h" 261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandusing namespace llvm; 281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 29259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the 30259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford// GR64 register operands turned into GR32s. 31259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandifordstatic MCInst lowerRILow(const MachineInstr *MI, unsigned Opcode) { 32259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford return MCInstBuilder(Opcode) 33259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg())) 34259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford .addReg(SystemZMC::getRegAsGR32(MI->getOperand(1).getReg())) 35259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford .addImm(MI->getOperand(2).getImm()); 36259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford} 37259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford 3855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the 39645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford// GR64 register operands turned into GRH32s. 40645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandifordstatic MCInst lowerRIHigh(const MachineInstr *MI, unsigned Opcode) { 41645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford return MCInstBuilder(Opcode) 42645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg())) 43645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(1).getReg())) 44645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford .addImm(MI->getOperand(2).getImm()); 45645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford} 46645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford 47645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the 4855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford// R2 register turned into a GR64. 4955d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandifordstatic MCInst lowerRIEfLow(const MachineInstr *MI, unsigned Opcode) { 5055d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford return MCInstBuilder(Opcode) 5155d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford .addReg(MI->getOperand(0).getReg()) 5255d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford .addReg(MI->getOperand(1).getReg()) 5355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford .addReg(SystemZMC::getRegAsGR64(MI->getOperand(2).getReg())) 5455d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford .addImm(MI->getOperand(3).getImm()) 5555d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford .addImm(MI->getOperand(4).getImm()) 5655d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford .addImm(MI->getOperand(5).getImm()); 5755d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford} 5855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford 591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::EmitInstruction(const MachineInstr *MI) { 6076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford SystemZMCInstLower Lower(Mang, MF->getContext(), *this); 611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MCInst LoweredMI; 629f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford switch (MI->getOpcode()) { 639f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford case SystemZ::Return: 649f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R14D); 659f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford break; 669f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford 6776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford case SystemZ::CallBRASL: 6876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford LoweredMI = MCInstBuilder(SystemZ::BRASL) 6976f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford .addReg(SystemZ::R14D) 7076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT)); 7176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford break; 7276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford 7376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford case SystemZ::CallBASR: 7476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford LoweredMI = MCInstBuilder(SystemZ::BASR) 7576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford .addReg(SystemZ::R14D) 7676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford .addReg(MI->getOperand(0).getReg()); 7776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford break; 7876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford 7976f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford case SystemZ::CallJG: 8076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford LoweredMI = MCInstBuilder(SystemZ::JG) 8176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT)); 8276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford break; 8376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford 8476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford case SystemZ::CallBR: 8576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R1D); 8676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford break; 8776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford 88259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford case SystemZ::IILF64: 89259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LoweredMI = MCInstBuilder(SystemZ::IILF) 90259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg())) 91259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford .addImm(MI->getOperand(2).getImm()); 92259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford break; 93259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford 944c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford case SystemZ::IIHF64: 954c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford LoweredMI = MCInstBuilder(SystemZ::IIHF) 964c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg())) 974c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford .addImm(MI->getOperand(2).getImm()); 984c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford break; 994c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford 10055d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford case SystemZ::RISBHH: 10155d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford case SystemZ::RISBHL: 10255d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford LoweredMI = lowerRIEfLow(MI, SystemZ::RISBHG); 10355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford break; 10455d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford 10555d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford case SystemZ::RISBLH: 10655d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford case SystemZ::RISBLL: 10755d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford LoweredMI = lowerRIEfLow(MI, SystemZ::RISBLG); 10855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford break; 10955d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford 110259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#define LOWER_LOW(NAME) \ 111259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford case SystemZ::NAME##64: LoweredMI = lowerRILow(MI, SystemZ::NAME); break 112259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford 113259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(IILL); 114259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(IILH); 115259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(NILL); 116259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(NILH); 117259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(NILF); 118259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(OILL); 119259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(OILH); 120259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(OILF); 121259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford LOWER_LOW(XILF); 122259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford 123259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#undef LOWER_LOW 124259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford 125645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#define LOWER_HIGH(NAME) \ 126645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford case SystemZ::NAME##64: LoweredMI = lowerRIHigh(MI, SystemZ::NAME); break 127645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford 128645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford LOWER_HIGH(IIHL); 129645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford LOWER_HIGH(IIHH); 1301c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford LOWER_HIGH(OIHL); 1311c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford LOWER_HIGH(OIHH); 1321c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford LOWER_HIGH(OIHF); 133645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford 134645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#undef LOWER_HIGH 135645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford 1369f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford default: 13776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford Lower.lower(MI, LoweredMI); 1389f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford break; 1399f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford } 1401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OutStreamer.EmitInstruction(LoweredMI); 1411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Convert a SystemZ-specific constant pool modifier into the associated 1441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// MCSymbolRefExpr variant kind. 1451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandstatic MCSymbolRefExpr::VariantKind 1461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandgetModifierVariantKind(SystemZCP::SystemZCPModifier Modifier) { 1471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand switch (Modifier) { 1481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand case SystemZCP::NTPOFF: return MCSymbolRefExpr::VK_NTPOFF; 1491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 1501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand llvm_unreachable("Invalid SystemCPModifier!"); 1511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter:: 1541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandEmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SystemZConstantPoolValue *ZCPV = 1561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand static_cast<SystemZConstantPoolValue*>(MCPV); 1571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const MCExpr *Expr = 1591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MCSymbolRefExpr::Create(Mang->getSymbol(ZCPV->getGlobalValue()), 1601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand getModifierVariantKind(ZCPV->getModifier()), 1611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OutContext); 1621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand uint64_t Size = TM.getDataLayout()->getTypeAllocSize(ZCPV->getType()); 1631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OutStreamer.EmitValue(Expr, Size); 1651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmOperand(const MachineInstr *MI, 1681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned OpNo, 1691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned AsmVariant, 1701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const char *ExtraCode, 1711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand raw_ostream &OS) { 1721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (ExtraCode && *ExtraCode == 'n') { 1731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (!MI->getOperand(OpNo).isImm()) 1741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return true; 1751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OS << -int64_t(MI->getOperand(OpNo).getImm()); 1761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } else { 1771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SystemZMCInstLower Lower(Mang, MF->getContext(), *this); 1781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MCOperand MO(Lower.lowerOperand(MI->getOperand(OpNo))); 1791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SystemZInstPrinter::printOperand(MO, OS); 1801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 1811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return false; 1821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, 1851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned OpNo, 1861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand unsigned AsmVariant, 1871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const char *ExtraCode, 1881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand raw_ostream &OS) { 1891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand SystemZInstPrinter::printAddress(MI->getOperand(OpNo).getReg(), 1901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MI->getOperand(OpNo + 1).getImm(), 1911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MI->getOperand(OpNo + 2).getReg(), OS); 1921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return false; 1931d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 1941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 1951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::EmitEndOfAsmFile(Module &M) { 1961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (Subtarget->isTargetELF()) { 1971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const TargetLoweringObjectFileELF &TLOFELF = 1981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand static_cast<const TargetLoweringObjectFileELF &>(getObjFileLowering()); 1991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>(); 2011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Output stubs for external and common global variables. 2031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList(); 2041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (!Stubs.empty()) { 2051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OutStreamer.SwitchSection(TLOFELF.getDataRelSection()); 2061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand const DataLayout *TD = TM.getDataLayout(); 2071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 2091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OutStreamer.EmitLabel(Stubs[i].first); 2101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(), 211a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola TD->getPointerSize(0)); 2121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 2131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand Stubs.clear(); 2141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 2151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand } 2161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 2171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 2181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Force static initialization. 2191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandextern "C" void LLVMInitializeSystemZAsmPrinter() { 2201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand RegisterAsmPrinter<SystemZAsmPrinter> X(TheSystemZTarget); 2211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 222