[llvm] r282854 - [AVR] Add the assembly instruction printer
Mehdi Amini via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 9 16:02:36 PDT 2016
> On Oct 9, 2016, at 3:56 PM, Mehdi Amini <mehdi.amini at apple.com> wrote:
>
>>
>> On Sep 30, 2016, at 7:01 AM, Dylan McKay via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: dylanmckay
>> Date: Fri Sep 30 09:01:50 2016
>> New Revision: 282854
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=282854&view=rev
>> Log:
>> [AVR] Add the assembly instruction printer
>>
>> Summary:
>> This change adds the AVR assembly instruction printer.
>>
>> No tests are included in this patch. I have left them downstream so we can
>> add them once `llc` successfully runs (there's very few components left
>> to upstream until this).
>>
>> Reviewers: arsenm, kparzysz
>>
>> Subscribers: wdng, beanz, mgorny
>>
>> Differential Revision: https://reviews.llvm.org/D25028
>>
>> Added:
>> llvm/trunk/lib/Target/AVR/InstPrinter/
>> llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.cpp
>> llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.h
>> llvm/trunk/lib/Target/AVR/InstPrinter/CMakeLists.txt
>> llvm/trunk/lib/Target/AVR/InstPrinter/LLVMBuild.txt
>> - copied, changed from r282852, llvm/trunk/lib/Target/AVR/LLVMBuild.txt
>> Modified:
>> llvm/trunk/lib/Target/AVR/CMakeLists.txt
>> llvm/trunk/lib/Target/AVR/LLVMBuild.txt
>>
>> Modified: llvm/trunk/lib/Target/AVR/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/CMakeLists.txt?rev=282854&r1=282853&r2=282854&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AVR/CMakeLists.txt (original)
>> +++ llvm/trunk/lib/Target/AVR/CMakeLists.txt Fri Sep 30 09:01:50 2016
>> @@ -17,7 +17,8 @@ add_llvm_target(AVRCodeGen
>>
>> add_dependencies(LLVMAVRCodeGen intrinsics_gen)
>>
>> +add_subdirectory(AsmParser)
>> +add_subdirectory(InstPrinter)
>> add_subdirectory(MCTargetDesc)
>> add_subdirectory(TargetInfo)
>> -add_subdirectory(AsmParser)
>>
>>
>> Added: llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.cpp?rev=282854&view=auto
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.cpp (added)
>> +++ llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.cpp Fri Sep 30 09:01:50 2016
>> @@ -0,0 +1,172 @@
>> +//===-- AVRInstPrinter.cpp - Convert AVR 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 AVR MCInst to a .s file.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "AVRInstPrinter.h"
>> +
>> +#include "MCTargetDesc/AVRMCTargetDesc.h"
>> +
>> +#include "llvm/MC/MCExpr.h"
>> +#include "llvm/MC/MCInst.h"
>> +#include "llvm/MC/MCInstrDesc.h"
>> +#include "llvm/MC/MCInstrInfo.h"
>> +#include "llvm/MC/MCRegisterInfo.h"
>> +#include "llvm/Support/ErrorHandling.h"
>> +#include "llvm/Support/FormattedStream.h"
>> +
>> +#include <cstring>
>> +
>> +#define DEBUG_TYPE "asm-printer"
>> +
>> +namespace llvm {
>> +
>> +// Include the auto-generated portion of the assembly writer.
>> +#define PRINT_ALIAS_INSTR
>> +#include “AVRGenAsmWriter.inc"
>
>
> This file does not seem generated, the build fails for me.
Even after patching the CMakeLists.txt to fix this, the link does not succeed:
"llvm::AVRTargetLowering::AVRTargetLowering(llvm::AVRTargetMachine&)", referenced from:
llvm::AVRSubtarget::AVRSubtarget(llvm::Triple const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, llvm::AVRTargetMachine&) in libLLVMAVRCodeGen.a(AVRSubtarget.cpp.o)
ld: symbol(s) not found for architecture x86_64
Is there a bot building this?
Was it building for you before you committed?
—
Mehdi
>
>
>> +
>> +void AVRInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
>> + StringRef Annot, const MCSubtargetInfo &STI) {
>> + unsigned Opcode = MI->getOpcode();
>> +
>> + // First handle load and store instructions with postinc or predec
>> + // of the form "ld reg, X+".
>> + // TODO: We should be able to rewrite this using TableGen data.
>> + switch (Opcode) {
>> + case AVR::LDRdPtr:
>> + case AVR::LDRdPtrPi:
>> + case AVR::LDRdPtrPd:
>> + O << "\tld\t";
>> + printOperand(MI, 0, O);
>> + O << ", ";
>> +
>> + if (Opcode == AVR::LDRdPtrPd)
>> + O << '-';
>> +
>> + printOperand(MI, 1, O);
>> +
>> + if (Opcode == AVR::LDRdPtrPi)
>> + O << '+';
>> + break;
>> + case AVR::STPtrRr:
>> + O << "\tst\t";
>> + printOperand(MI, 0, O);
>> + O << ", ";
>> + printOperand(MI, 1, O);
>> + break;
>> + case AVR::STPtrPiRr:
>> + case AVR::STPtrPdRr:
>> + O << "\tst\t";
>> +
>> + if (Opcode == AVR::STPtrPdRr)
>> + O << '-';
>> +
>> + printOperand(MI, 1, O);
>> +
>> + if (Opcode == AVR::STPtrPiRr)
>> + O << '+';
>> +
>> + O << ", ";
>> + printOperand(MI, 2, O);
>> + break;
>> + default:
>> + if (!printAliasInstr(MI, O))
>> + printInstruction(MI, O);
>> +
>> + printAnnotation(O, Annot);
>> + break;
>> + }
>> +}
>> +
>> +const char *AVRInstPrinter::getPrettyRegisterName(unsigned RegNum,
>> + MCRegisterInfo const &MRI) {
>> + // GCC prints register pairs by just printing the lower register
>> + // If the register contains a subregister, print it instead
>> + if (MRI.getNumSubRegIndices() > 0) {
>> + unsigned RegLoNum = MRI.getSubReg(RegNum, AVR::sub_lo);
>> + RegNum = (RegLoNum != AVR::NoRegister) ? RegLoNum : RegNum;
>> + }
>> +
>> + return getRegisterName(RegNum);
>> +}
>> +
>> +void AVRInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
>> + raw_ostream &O) {
>> + const MCOperand &Op = MI->getOperand(OpNo);
>> + const MCOperandInfo &MOI = this->MII.get(MI->getOpcode()).OpInfo[OpNo];
>> +
>> + if (Op.isReg()) {
>> + bool isPtrReg = (MOI.RegClass == AVR::PTRREGSRegClassID) ||
>> + (MOI.RegClass == AVR::PTRDISPREGSRegClassID) ||
>> + (MOI.RegClass == AVR::ZREGSRegClassID);
>> +
>> + if (isPtrReg) {
>> + O << getRegisterName(Op.getReg(), AVR::ptr);
>> + } else {
>> + O << getPrettyRegisterName(Op.getReg(), MRI);
>> + }
>> + } else if (Op.isImm()) {
>> + O << Op.getImm();
>> + } else {
>> + assert(Op.isExpr() && "Unknown operand kind in printOperand");
>> + O << *Op.getExpr();
>> + }
>> +}
>> +
>> +/// This is used to print an immediate value that ends up
>> +/// being encoded as a pc-relative value.
>> +void AVRInstPrinter::printPCRelImm(const MCInst *MI, unsigned OpNo,
>> + raw_ostream &O) {
>> + const MCOperand &Op = MI->getOperand(OpNo);
>> +
>> + if (Op.isImm()) {
>> + int64_t Imm = Op.getImm();
>> + O << '.';
>> +
>> + // Print a position sign if needed.
>> + // Negative values have their sign printed automatically.
>> + if (Imm >= 0)
>> + O << '+';
>> +
>> + O << Imm;
>> + } else {
>> + assert(Op.isExpr() && "Unknown pcrel immediate operand");
>> + O << *Op.getExpr();
>> + }
>> +}
>> +
>> +void AVRInstPrinter::printMemri(const MCInst *MI, unsigned OpNo,
>> + raw_ostream &O) {
>> + const MCOperand &RegOp = MI->getOperand(OpNo);
>> + const MCOperand &OffsetOp = MI->getOperand(OpNo + 1);
>> +
>> + assert(RegOp.isReg() && "Expected a register");
>> +
>> + // Print the register.
>> + printOperand(MI, OpNo, O);
>> +
>> + // Print the {+,-}offset.
>> + if (OffsetOp.isImm()) {
>> + int64_t Offset = OffsetOp.getImm();
>> +
>> + if (Offset >= 0)
>> + O << '+';
>> +
>> + O << Offset;
>> + } else if (OffsetOp.isExpr()) {
>> + O << *OffsetOp.getExpr();
>> + } else {
>> + llvm_unreachable("unknown type for offset");
>> + }
>> +}
>> +
>> +} // end of namespace llvm
>> +
>>
>> Added: llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.h?rev=282854&view=auto
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.h (added)
>> +++ llvm/trunk/lib/Target/AVR/InstPrinter/AVRInstPrinter.h Fri Sep 30 09:01:50 2016
>> @@ -0,0 +1,54 @@
>> +//===- AVRInstPrinter.h - Convert AVR MCInst to assembly syntax -*- C++ -*-===//
>> +//
>> +// 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 AVR MCInst to a .s file.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_AVR_INST_PRINTER_H
>> +#define LLVM_AVR_INST_PRINTER_H
>> +
>> +#include "llvm/MC/MCInstPrinter.h"
>> +
>> +#include "MCTargetDesc/AVRMCTargetDesc.h"
>> +
>> +namespace llvm {
>> +
>> +/// Prints AVR instructions to a textual stream.
>> +class AVRInstPrinter : public MCInstPrinter {
>> +public:
>> + AVRInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
>> + const MCRegisterInfo &MRI)
>> + : MCInstPrinter(MAI, MII, MRI) {}
>> +
>> + static const char *getPrettyRegisterName(unsigned RegNo,
>> + MCRegisterInfo const &MRI);
>> +
>> + void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
>> + const MCSubtargetInfo &STI) override;
>> +
>> +private:
>> + static const char *getRegisterName(unsigned RegNo,
>> + unsigned AltIdx = AVR::NoRegAltName);
>> +
>> + void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
>> + void printPCRelImm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
>> + void printMemri(const MCInst *MI, unsigned OpNo, raw_ostream &O);
>> +
>> + // Autogenerated by TableGen.
>> + void printInstruction(const MCInst *MI, raw_ostream &O);
>> + bool printAliasInstr(const MCInst *MI, raw_ostream &O);
>> + void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
>> + unsigned PrintMethodIdx, raw_ostream &O);
>> +};
>> +
>> +} // end namespace llvm
>> +
>> +#endif // LLVM_AVR_INST_PRINTER_H
>> +
>>
>> Added: llvm/trunk/lib/Target/AVR/InstPrinter/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/InstPrinter/CMakeLists.txt?rev=282854&view=auto
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AVR/InstPrinter/CMakeLists.txt (added)
>> +++ llvm/trunk/lib/Target/AVR/InstPrinter/CMakeLists.txt Fri Sep 30 09:01:50 2016
>> @@ -0,0 +1,8 @@
>> +include_directories( ${CMAKE_CURRENT_BINARY_DIR}/..
>> + ${CMAKE_CURRENT_SOURCE_DIR}/.. )
>> +
>> +add_llvm_library(LLVMAVRAsmPrinter
>> + AVRInstPrinter.cpp
>> + )
>> +
>> +add_dependencies(LLVMAVRAsmPrinter AVRCommonTableGen)
>> \ No newline at end of file
>>
>> Copied: llvm/trunk/lib/Target/AVR/InstPrinter/LLVMBuild.txt (from r282852, llvm/trunk/lib/Target/AVR/LLVMBuild.txt)
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/InstPrinter/LLVMBuild.txt?p2=llvm/trunk/lib/Target/AVR/InstPrinter/LLVMBuild.txt&p1=llvm/trunk/lib/Target/AVR/LLVMBuild.txt&r1=282852&r2=282854&rev=282854&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AVR/LLVMBuild.txt (original)
>> +++ llvm/trunk/lib/Target/AVR/InstPrinter/LLVMBuild.txt Fri Sep 30 09:01:50 2016
>> @@ -1,4 +1,4 @@
>> -;===- ./lib/Target/AVR/LLVMBuild.txt ---------------------------*- Conf -*--===;
>> +;===- ./lib/Target/AVR/InstPrinter/LLVMBuild.txt ----------------*- Conf -*--===;
>> ;
>> ; The LLVM Compiler Infrastructure
>> ;
>> @@ -15,19 +15,9 @@
>> ;
>> ;===------------------------------------------------------------------------===;
>>
>> -[common]
>> -subdirectories = TargetInfo
>> -
>> [component_0]
>> -type = TargetGroup
>> -name = AVR
>> -parent = Target
>> -has_asmprinter = 0
>> -has_asmparser = 1
>> -
>> -[component_1]
>> type = Library
>> -name = AVRCodeGen
>> +name = AVRAsmPrinter
>> parent = AVR
>> -required_libraries = AsmPrinter CodeGen Core MC AVRInfo SelectionDAG Support Target
>> -add_to_library_groups = AVR
>> +required_libraries = MC Support
>> +add_to_library_groups = AVR
>> \ No newline at end of file
>>
>> Modified: llvm/trunk/lib/Target/AVR/LLVMBuild.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/LLVMBuild.txt?rev=282854&r1=282853&r2=282854&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AVR/LLVMBuild.txt (original)
>> +++ llvm/trunk/lib/Target/AVR/LLVMBuild.txt Fri Sep 30 09:01:50 2016
>> @@ -22,7 +22,7 @@ subdirectories = TargetInfo
>> type = TargetGroup
>> name = AVR
>> parent = Target
>> -has_asmprinter = 0
>> +has_asmprinter = 1
>> has_asmparser = 1
>>
>> [component_1]
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161009/1f704943/attachment-0001.html>
More information about the llvm-commits
mailing list