[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