remember to emit weak reference in one more case.
authorLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 25 Apr 2007 14:50:40 +0000 (14:50 +0000)
committerLauro Ramos Venancio <lauro.venancio@gmail.com>
Wed, 25 Apr 2007 14:50:40 +0000 (14:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36438 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMAsmPrinter.cpp
test/CodeGen/ARM/weak2.ll [new file with mode: 0644]

index 6822e632824a1c383df3e5affbdfa18adb39465d..6e9a9038dc44271dcca9896c66af11a7a9ff4ebe 100644 (file)
@@ -639,8 +639,13 @@ void ARMAsmPrinter::printCPInstOperand(const MachineInstr *MI, int OpNo,
     
     if (MCPE.isMachineConstantPoolEntry())
       EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal);
-    else
+    else {
       EmitGlobalConstant(MCPE.Val.ConstVal);
+      // remember to emit the weak reference
+      if (const GlobalValue *GV = dyn_cast<GlobalValue>(MCPE.Val.ConstVal))
+        if (GV->hasExternalWeakLinkage())
+          ExtWeakSymbols.insert(GV);
+    }
   }
 }
 
diff --git a/test/CodeGen/ARM/weak2.ll b/test/CodeGen/ARM/weak2.ll
new file mode 100644 (file)
index 0000000..a57a767
--- /dev/null
@@ -0,0 +1,18 @@
+; RUN: llvm-as < %s | llc -march=arm | grep .weak
+
+define i32 @f(i32 %a) {
+entry:
+       %tmp2 = icmp eq i32 %a, 0               ; <i1> [#uses=1]
+       %t.0 = select i1 %tmp2, i32 (...)* null, i32 (...)* @test_weak          ; <i32 (...)*> [#uses=2]
+       %tmp5 = icmp eq i32 (...)* %t.0, null           ; <i1> [#uses=1]
+       br i1 %tmp5, label %UnifiedReturnBlock, label %cond_true8
+
+cond_true8:            ; preds = %entry
+       %tmp10 = tail call i32 (...)* %t.0( )           ; <i32> [#uses=1]
+       ret i32 %tmp10
+
+UnifiedReturnBlock:            ; preds = %entry
+       ret i32 250
+}
+
+declare extern_weak i32 @test_weak(...)