[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