[llvm] r282854 - [AVR] Add the assembly instruction printer

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 9 15:56:03 PDT 2016


> 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.

— 
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



More information about the llvm-commits mailing list