[llvm] r307888 - [AVR] Fix indirect calls to function pointers

Dylan McKay via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 13 01:09:37 PDT 2017


Author: dylanmckay
Date: Thu Jul 13 01:09:36 2017
New Revision: 307888

URL: http://llvm.org/viewvc/llvm-project?rev=307888&view=rev
Log:
[AVR] Fix indirect calls to function pointers

Patch by Carl Peto.

Added:
    llvm/trunk/test/CodeGen/AVR/icall-func-pointer-correct-addr-space.ll
Modified:
    llvm/trunk/lib/Target/AVR/AVRMCInstLower.cpp

Modified: llvm/trunk/lib/Target/AVR/AVRMCInstLower.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AVR/AVRMCInstLower.cpp?rev=307888&r1=307887&r2=307888&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AVR/AVRMCInstLower.cpp (original)
+++ llvm/trunk/lib/Target/AVR/AVRMCInstLower.cpp Thu Jul 13 01:09:36 2017
@@ -37,10 +37,22 @@ MCOperand AVRMCInstLower::lowerSymbolOpe
         Expr, MCConstantExpr::create(MO.getOffset(), Ctx), Ctx);
   }
 
+  bool IsFunction = MO.isGlobal() && isa<Function>(MO.getGlobal());
+
   if (TF & AVRII::MO_LO) {
-    Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_LO8, Expr, IsNegated, Ctx);
+    if (IsFunction) {
+      // N.B. Should we use _GS fixups here to cope with >128k progmem?
+      Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_PM_LO8, Expr, IsNegated, Ctx);
+    } else {
+      Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_LO8, Expr, IsNegated, Ctx);
+    }
   } else if (TF & AVRII::MO_HI) {
-    Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_HI8, Expr, IsNegated, Ctx);
+    if (IsFunction) {
+      // N.B. Should we use _GS fixups here to cope with >128k progmem?
+      Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_PM_HI8, Expr, IsNegated, Ctx);
+    } else {
+      Expr = AVRMCExpr::create(AVRMCExpr::VK_AVR_HI8, Expr, IsNegated, Ctx);
+    }
   } else if (TF != 0) {
     llvm_unreachable("Unknown target flag on symbol operand");
   }

Added: llvm/trunk/test/CodeGen/AVR/icall-func-pointer-correct-addr-space.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AVR/icall-func-pointer-correct-addr-space.ll?rev=307888&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AVR/icall-func-pointer-correct-addr-space.ll (added)
+++ llvm/trunk/test/CodeGen/AVR/icall-func-pointer-correct-addr-space.ll Thu Jul 13 01:09:36 2017
@@ -0,0 +1,15 @@
+; RUN: llc -mattr=lpm,lpmw < %s -march=avr | FileCheck %s
+
+declare void @callback(i16 zeroext)
+
+; CHECK-LABEL: foo
+define void @foo() {
+entry:
+  ; CHECK:      ldi     r{{[0-9]+}}, pm_lo8(callback)
+  ; CHECK-NEXT: ldi     r{{[0-9]+}}, pm_hi8(callback)
+  call void @bar(i8 zeroext undef, void (i16)* @callback)
+  ret void
+}
+
+declare void @bar(i8 zeroext, void (i16)*)
+




More information about the llvm-commits mailing list