From owner-svn-src-projects@FreeBSD.ORG Fri Jun 10 23:05:51 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6FD78106564A; Fri, 10 Jun 2011 23:05:51 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5CEBC8FC13; Fri, 10 Jun 2011 23:05:51 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p5AN5p6p047119; Fri, 10 Jun 2011 23:05:51 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p5AN5pNj047108; Fri, 10 Jun 2011 23:05:51 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201106102305.p5AN5pNj047108@svn.freebsd.org> From: Marcel Moolenaar Date: Fri, 10 Jun 2011 23:05:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r222959 - in projects/llvm-ia64: contrib/llvm/lib/Target/IA64 contrib/llvm/lib/Target/IA64/InstPrinter lib/clang lib/clang/libllvmia64codegen lib/clang/libllvmia64instprinter usr.bin/cl... X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jun 2011 23:05:51 -0000 Author: marcel Date: Fri Jun 10 23:05:51 2011 New Revision: 222959 URL: http://svn.freebsd.org/changeset/base/222959 Log: Add the AsmPrinter and InstPrinter classes. Unfortunately, this doesn't change the falure more (though it may have changed when or where it happens). Suggested by: rdivacky Added: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64MCInstLower.cpp projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64MCInstLower.h projects/llvm-ia64/contrib/llvm/lib/Target/IA64/InstPrinter/ projects/llvm-ia64/contrib/llvm/lib/Target/IA64/InstPrinter/IA64InstPrinter.cpp projects/llvm-ia64/contrib/llvm/lib/Target/IA64/InstPrinter/IA64InstPrinter.h projects/llvm-ia64/lib/clang/libllvmia64instprinter/ projects/llvm-ia64/lib/clang/libllvmia64instprinter/Makefile Modified: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64.td projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64AsmPrinter.cpp projects/llvm-ia64/lib/clang/Makefile projects/llvm-ia64/lib/clang/libllvmia64codegen/Makefile projects/llvm-ia64/usr.bin/clang/clang/Makefile Modified: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64.td ============================================================================== --- projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64.td Fri Jun 10 22:48:35 2011 (r222958) +++ projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64.td Fri Jun 10 23:05:51 2011 (r222959) @@ -48,8 +48,17 @@ def NOP : IA64Instruction<(outs), (ins)> def IA64InstrInfo : InstrInfo; // +// Machine code and assembly writer +// +def IA64InstPrinter : AsmWriter { + string AsmWriterClassName = "InstPrinter"; + bit isMCAsmWriter = 1; +} + +// // Target for the Itanium Processor Family (IPF) // def IA64 : Target { let InstructionSet = IA64InstrInfo; + let AssemblyWriters = [IA64InstPrinter]; } Modified: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64AsmPrinter.cpp ============================================================================== --- projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64AsmPrinter.cpp Fri Jun 10 22:48:35 2011 (r222958) +++ projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64AsmPrinter.cpp Fri Jun 10 23:05:51 2011 (r222959) @@ -1,56 +1,131 @@ #include "IA64.h" +#include "IA64InstrInfo.h" +#include "IA64MCAsmInfo.h" +#include "IA64MCInstLower.h" +#include "IA64TargetMachine.h" +#include "InstPrinter/IA64InstPrinter.h" +#include "llvm/Constants.h" +#include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/Type.h" +#include "llvm/Assembly/Writer.h" #include "llvm/CodeGen/AsmPrinter.h" -#include "llvm/CodeGen/DwarfWriter.h" +#include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineFunctionPass.h" -#include "llvm/MC/MCAsmInfo.h" +#include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/MC/MCInst.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbol.h" +#include "llvm/Target/Mangler.h" +#include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetRegistry.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/FormattedStream.h" -#include "llvm/ADT/Statistic.h" +#include "llvm/Support/raw_ostream.h" using namespace llvm; namespace { + class IA64AsmPrinter : public AsmPrinter { - std::set ExternalFunctionNames, ExternalObjectNames; public: - explicit IA64AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM, - const MCAsmInfo *T, bool V) : - AsmPrinter(O, TM, T, V) {} + IA64AsmPrinter(TargetMachine &TM, MCStreamer &Streamer) : + AsmPrinter(TM, Streamer) {} virtual const char *getPassName() const { - return "IA64 Assembly Printer"; + return "IA-64 Assembly Printer"; } - static const char *getRegisterName(unsigned RegNo); - - void PrintGlobalVariable(const GlobalVariable *GVar); - - void printInstruction(const MachineInstr *MI); - bool runOnMachineFunction(MachineFunction &F); + void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O, + const char* Modifier = 0); + void printSrcMemOperand(const MachineInstr *MI, int OpNum, raw_ostream &O); + bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, + unsigned AsmVariant, const char *ExtraCode, raw_ostream &O); + bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, + unsigned AsmVariant, const char *ExtraCode, raw_ostream &O); + void EmitInstruction(const MachineInstr *MI); }; -} // end of anonymous namespace -#include "IA64GenAsmWriter.inc" +} // end of anonymous namespace void -IA64AsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) +IA64AsmPrinter::printOperand(const MachineInstr *MI, int OpNum, + raw_ostream &O, const char *Modifier) { llvm_unreachable(__func__); } +void +IA64AsmPrinter::printSrcMemOperand(const MachineInstr *MI, int OpNum, + raw_ostream &O) +{ + const MachineOperand &Base = MI->getOperand(OpNum); + const MachineOperand &Disp = MI->getOperand(OpNum+1); + + // Print displacement first + + // Imm here is in fact global address - print extra modifier. + if (Disp.isImm() && !Base.getReg()) + O << '&'; + printOperand(MI, OpNum+1, O, "nohash"); + + // Print register base field + if (Base.getReg()) { + O << '('; + printOperand(MI, OpNum, O); + O << ')'; + } +} + +/// PrintAsmOperand - Print out an operand for an inline asm expression. bool -IA64AsmPrinter::runOnMachineFunction(MachineFunction &MF) +IA64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, + unsigned AsmVariant, const char *ExtraCode, raw_ostream &O) { - llvm_unreachable(__func__); + // Does this asm operand have a single letter operand modifier? + if (ExtraCode && ExtraCode[0]) + return true; // Unknown modifier. + + printOperand(MI, OpNo, O); + return false; +} + +bool +IA64AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, + unsigned AsmVariant, const char *ExtraCode, raw_ostream &O) +{ + if (ExtraCode && ExtraCode[0]) { + return true; // Unknown modifier. + } + printSrcMemOperand(MI, OpNo, O); + return false; +} + +void +IA64AsmPrinter::EmitInstruction(const MachineInstr *MI) +{ + IA64MCInstLower MCInstLowering(OutContext, *Mang, *this); + + MCInst TmpInst; + MCInstLowering.Lower(MI, TmpInst); + OutStreamer.EmitInstruction(TmpInst); } +static +MCInstPrinter *createIA64MCInstPrinter(const Target &T, TargetMachine &TM, + unsigned SyntaxVariant, const MCAsmInfo &MAI) +{ + if (SyntaxVariant == 0) + return new IA64InstPrinter(TM, MAI); + return 0; +} +// Force static initialization. extern "C" void LLVMInitializeIA64AsmPrinter() { RegisterAsmPrinter X(TheIA64Target); + TargetRegistry::RegisterMCInstPrinter(TheIA64Target, + createIA64MCInstPrinter); } Added: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64MCInstLower.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64MCInstLower.cpp Fri Jun 10 23:05:51 2011 (r222959) @@ -0,0 +1,58 @@ +#include "IA64MCInstLower.h" + +#include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/MachineBasicBlock.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/MC/MCInst.h" +#include "llvm/Target/Mangler.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/ADT/SmallString.h" + +using namespace llvm; + +MCSymbol * +IA64MCInstLower::GetGlobalAddressSymbol(const MachineOperand &MO) const +{ + llvm_unreachable(__func__); +} + +MCSymbol * +IA64MCInstLower::GetExternalSymbolSymbol(const MachineOperand &MO) const +{ + llvm_unreachable(__func__); +} + +MCSymbol * +IA64MCInstLower::GetJumpTableSymbol(const MachineOperand &MO) const +{ + llvm_unreachable(__func__); +} + +MCSymbol * +IA64MCInstLower::GetConstantPoolIndexSymbol(const MachineOperand &MO) const +{ + llvm_unreachable(__func__); +} + +MCSymbol * +IA64MCInstLower::GetBlockAddressSymbol(const MachineOperand &MO) const +{ + llvm_unreachable(__func__); +} + +MCOperand +IA64MCInstLower::LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) + const +{ + llvm_unreachable(__func__); +} + +void +IA64MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const +{ + llvm_unreachable(__func__); +} Added: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64MCInstLower.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/llvm-ia64/contrib/llvm/lib/Target/IA64/IA64MCInstLower.h Fri Jun 10 23:05:51 2011 (r222959) @@ -0,0 +1,42 @@ +#ifndef LLVM_TARGET_IA64_MCINSTLOWER_H +#define LLVM_TARGET_IA64_MCINSTLOWER_H + +#include "llvm/Support/Compiler.h" + +namespace llvm { + + class AsmPrinter; + class MCAsmInfo; + class MCContext; + class MCInst; + class MCOperand; + class MCSymbol; + class MachineInstr; + class MachineModuleInfoMachO; + class MachineOperand; + class Mangler; + + /// IA64MCInstLower - This class is used to lower an MachineInstr + /// into an MCInst. + class LLVM_LIBRARY_VISIBILITY IA64MCInstLower { + MCContext &Ctx; + Mangler &Mang; + + AsmPrinter &Printer; + public: + IA64MCInstLower(MCContext &ctx, Mangler &mang, AsmPrinter &printer) : + Ctx(ctx), Mang(mang), Printer(printer) {} + void Lower(const MachineInstr *MI, MCInst &OutMI) const; + + MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const; + + MCSymbol *GetGlobalAddressSymbol(const MachineOperand &MO) const; + MCSymbol *GetExternalSymbolSymbol(const MachineOperand &MO) const; + MCSymbol *GetJumpTableSymbol(const MachineOperand &MO) const; + MCSymbol *GetConstantPoolIndexSymbol(const MachineOperand &MO) const; + MCSymbol *GetBlockAddressSymbol(const MachineOperand &MO) const; + }; + +} // namespace llvm + +#endif // LLVM_TARGET_IA64_MCINSTLOWER_H Added: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/InstPrinter/IA64InstPrinter.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/llvm-ia64/contrib/llvm/lib/Target/IA64/InstPrinter/IA64InstPrinter.cpp Fri Jun 10 23:05:51 2011 (r222959) @@ -0,0 +1,84 @@ +#include "IA64.h" +#include "IA64InstPrinter.h" + +#include "llvm/MC/MCInst.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FormattedStream.h" + +using namespace llvm; + +// Include the auto-generated portion of the assembly writer. +#include "IA64GenAsmWriter.inc" + +void +IA64InstPrinter::printInst(const MCInst *MI, raw_ostream &O) +{ + printInstruction(MI, O); +} + +void +IA64InstPrinter::printPCRelImmOperand(const MCInst *MI, unsigned OpNo, + raw_ostream &O) +{ + const MCOperand &Op = MI->getOperand(OpNo); + if (Op.isImm()) + O << Op.getImm(); + else { + assert(Op.isExpr() && "unknown pcrel immediate operand"); + O << *Op.getExpr(); + } +} + +void +IA64InstPrinter::printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O, + const char *Modifier) +{ + assert((Modifier == 0 || Modifier[0] == 0) && "No modifiers supported"); + const MCOperand &Op = MI->getOperand(OpNo); + if (Op.isReg()) { + O << getRegisterName(Op.getReg()); + } else if (Op.isImm()) { + O << '#' << Op.getImm(); + } else { + assert(Op.isExpr() && "unknown operand kind in printOperand"); + O << '#' << *Op.getExpr(); + } +} + +void IA64InstPrinter::printSrcMemOperand(const MCInst *MI, unsigned OpNo, + raw_ostream &O, const char *Modifier) +{ + const MCOperand &Base = MI->getOperand(OpNo); + const MCOperand &Disp = MI->getOperand(OpNo+1); + + // Print displacement first + + // If the global address expression is a part of displacement field with a + // register base, we should not emit any prefix symbol here, e.g. + // mov.w &foo, r1 + // vs + // mov.w glb(r1), r2 + // Otherwise (!) msp430-as will silently miscompile the output :( + if (!Base.getReg()) + O << '&'; + + if (Disp.isExpr()) + O << *Disp.getExpr(); + else { + assert(Disp.isImm() && "Expected immediate in displacement field"); + O << Disp.getImm(); + } + + // Print register base field + if (Base.getReg()) + O << '(' << getRegisterName(Base.getReg()) << ')'; +} + +void +IA64InstPrinter::printCCOperand(const MCInst *MI, unsigned OpNo, + raw_ostream &O) +{ + llvm_unreachable(__func__); +} Added: projects/llvm-ia64/contrib/llvm/lib/Target/IA64/InstPrinter/IA64InstPrinter.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/llvm-ia64/contrib/llvm/lib/Target/IA64/InstPrinter/IA64InstPrinter.h Fri Jun 10 23:05:51 2011 (r222959) @@ -0,0 +1,32 @@ +#ifndef LLVM_TARGET_IA64_INSTPRINTER_H +#define LLVM_TARGET_IA64_INSTPRINTER_H + +#include "llvm/MC/MCInstPrinter.h" + +namespace llvm { + + class MCOperand; + class TargetMachine; + + class IA64InstPrinter : public MCInstPrinter { + public: + IA64InstPrinter(TargetMachine &TM, const MCAsmInfo &MAI) : + MCInstPrinter(MAI) {} + + virtual void printInst(const MCInst *MI, raw_ostream &O); + + // 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, + const char *Modifier = 0); + void printPCRelImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); + void printSrcMemOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O, + const char *Modifier = 0); + void printCCOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); + }; + +} // namespace llvm + +#endif // LLVM_TARGET_IA64_INSTPRINTER_H Modified: projects/llvm-ia64/lib/clang/Makefile ============================================================================== --- projects/llvm-ia64/lib/clang/Makefile Fri Jun 10 22:48:35 2011 (r222958) +++ projects/llvm-ia64/lib/clang/Makefile Fri Jun 10 23:05:51 2011 (r222959) @@ -44,6 +44,7 @@ SUBDIR= libclanganalysis \ libllvmarminstprinter \ libllvmia64codegen \ libllvmia64info \ + libllvmia64instprinter \ libllvmmipscodegen \ libllvmmipsinfo \ libllvmpowerpccodegen \ Modified: projects/llvm-ia64/lib/clang/libllvmia64codegen/Makefile ============================================================================== --- projects/llvm-ia64/lib/clang/libllvmia64codegen/Makefile Fri Jun 10 22:48:35 2011 (r222958) +++ projects/llvm-ia64/lib/clang/libllvmia64codegen/Makefile Fri Jun 10 23:05:51 2011 (r222959) @@ -4,10 +4,12 @@ LIB= llvmia64codegen SRCDIR= lib/Target/IA64 SRCS= \ + IA64AsmPrinter.cpp \ IA64FrameLowering.cpp \ IA64InstrInfo.cpp \ IA64TargetLowering.cpp \ IA64MCAsmInfo.cpp \ + IA64MCInstLower.cpp \ IA64RegisterInfo.cpp \ IA64SelectionDAGInfo.cpp \ IA64Subtarget.cpp \ Added: projects/llvm-ia64/lib/clang/libllvmia64instprinter/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/llvm-ia64/lib/clang/libllvmia64instprinter/Makefile Fri Jun 10 23:05:51 2011 (r222959) @@ -0,0 +1,14 @@ +# $FreeBSD$ + +LIB= llvmia64instprinter + +SRCDIR= lib/Target/IA64/InstPrinter +INCDIR= lib/Target/IA64 +SRCS= IA64InstPrinter.cpp + +TGHDRS= \ + IA64GenAsmWriter \ + IA64GenInstrNames \ + IA64GenRegisterNames + +.include "../clang.lib.mk" Modified: projects/llvm-ia64/usr.bin/clang/clang/Makefile ============================================================================== --- projects/llvm-ia64/usr.bin/clang/clang/Makefile Fri Jun 10 22:48:35 2011 (r222958) +++ projects/llvm-ia64/usr.bin/clang/clang/Makefile Fri Jun 10 23:05:51 2011 (r222959) @@ -47,6 +47,7 @@ LIBDEPS=clangfrontendtool \ llvmarminfo \ llvmia64codegen \ llvmia64info \ + llvmia64instprinter \ llvmmipscodegen \ llvmmipsinfo \ llvmpowerpccodegen \