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