From: Richard Osborne Date: Fri, 16 Nov 2012 21:12:38 +0000 (+0000) Subject: Fix handling of aliases to functions. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ccc015d4314e966253668deec2b18a0d3e0cf4c0;p=oota-llvm.git Fix handling of aliases to functions. An alias to a function should use pc relative addressing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168199 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/XCore/XCoreISelLowering.cpp b/lib/Target/XCore/XCoreISelLowering.cpp index 9e7816e21f8..f1098f9dc35 100644 --- a/lib/Target/XCore/XCoreISelLowering.cpp +++ b/lib/Target/XCore/XCoreISelLowering.cpp @@ -225,20 +225,16 @@ getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV, { // FIXME there is no actual debug info here DebugLoc dl = GA.getDebugLoc(); - if (isa(GV)) { - return DAG.getNode(XCoreISD::PCRelativeWrapper, dl, MVT::i32, GA); + const GlobalValue *UnderlyingGV = GV; + // If GV is an alias then use the aliasee to determine the wrapper type + if (const GlobalAlias *GA = dyn_cast(GV)) + UnderlyingGV = GA->resolveAliasedGlobal(); + if (const GlobalVariable *GVar = dyn_cast(UnderlyingGV)) { + if (GVar->isConstant()) + return DAG.getNode(XCoreISD::CPRelativeWrapper, dl, MVT::i32, GA); + return DAG.getNode(XCoreISD::DPRelativeWrapper, dl, MVT::i32, GA); } - const GlobalVariable *GVar = dyn_cast(GV); - if (!GVar) { - // If GV is an alias then use the aliasee to determine constness - if (const GlobalAlias *GA = dyn_cast(GV)) - GVar = dyn_cast_or_null(GA->resolveAliasedGlobal()); - } - bool isConst = GVar && GVar->isConstant(); - if (isConst) { - return DAG.getNode(XCoreISD::CPRelativeWrapper, dl, MVT::i32, GA); - } - return DAG.getNode(XCoreISD::DPRelativeWrapper, dl, MVT::i32, GA); + return DAG.getNode(XCoreISD::PCRelativeWrapper, dl, MVT::i32, GA); } SDValue XCoreTargetLowering:: diff --git a/test/CodeGen/XCore/aliases.ll b/test/CodeGen/XCore/aliases.ll new file mode 100644 index 00000000000..d83b246a552 --- /dev/null +++ b/test/CodeGen/XCore/aliases.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -march=xcore | FileCheck %s +declare void @a_val() nounwind +@b_val = external constant i32, section ".cp.rodata" +@c_val = external global i32 + +@a = alias void ()* @a_val +@b = alias i32* @b_val +@c = alias i32* @c_val + +; CHECK: a_addr: +; CHECK: ldap r11, a +; CHECK: retsp +define void ()* @a_addr() nounwind { +entry: + ret void ()* @a +} + +; CHECK: b_addr: +; CHECK: ldaw r11, cp[b] +; CHECK: retsp +define i32 *@b_addr() nounwind { +entry: + ret i32* @b +} + +; CHECK: c_addr: +; CHECK: ldaw r0, dp[c] +; CHECK: retsp +define i32 *@c_addr() nounwind { +entry: + ret i32* @c +}