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