gold plugin: Remap function arguments when creating a replacement function.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 7 Oct 2014 00:47:38 +0000 (00:47 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 7 Oct 2014 00:47:38 +0000 (00:47 +0000)
When creating an internal function replacement for use in an alias we were
not remapping the argument uses in the instructions to point to the new
arguments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219177 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/gold/Inputs/comdat.ll
test/tools/gold/comdat.ll
tools/gold/gold-plugin.cpp

index b9a639a7ff0ea45c359168c80510098d4d2f5104..4767fe78796bc0c1e1568f611b051665477f1ce2 100644 (file)
@@ -1,19 +1,20 @@
 $c2 = comdat any
 
 @v1 = weak_odr global i32 41, comdat $c2
 $c2 = comdat any
 
 @v1 = weak_odr global i32 41, comdat $c2
-define weak_odr i32 @f1() comdat $c2 {
+define weak_odr i32 @f1(i8* %this) comdat $c2 {
 bb20:
 bb20:
+  store i8* %this, i8** null
   br label %bb21
 bb21:
   ret i32 41
 }
 
 @r21 = global i32* @v1
   br label %bb21
 bb21:
   ret i32 41
 }
 
 @r21 = global i32* @v1
-@r22 = global i32()* @f1
+@r22 = global i32(i8*)* @f1
 
 @a21 = alias i32* @v1
 @a22 = alias bitcast (i32* @v1 to i16*)
 
 
 @a21 = alias i32* @v1
 @a22 = alias bitcast (i32* @v1 to i16*)
 
-@a23 = alias i32()* @f1
-@a24 = alias bitcast (i32()* @f1 to i16*)
+@a23 = alias i32(i8*)* @f1
+@a24 = alias bitcast (i32(i8*)* @f1 to i16*)
 @a25 = alias i16* @a24
 @a25 = alias i16* @a24
index cb8599e0cf066acc1bc0af2f2ee61bb3acfdc448..7b1fbd617c0d16e1a3ae69a9475edab3adc58b75 100644 (file)
@@ -7,7 +7,7 @@
 $c1 = comdat any
 
 @v1 = weak_odr global i32 42, comdat $c1
 $c1 = comdat any
 
 @v1 = weak_odr global i32 42, comdat $c1
-define weak_odr i32 @f1() comdat $c1 {
+define weak_odr i32 @f1(i8*) comdat $c1 {
 bb10:
   br label %bb11
 bb11:
 bb10:
   br label %bb11
 bb11:
@@ -15,13 +15,13 @@ bb11:
 }
 
 @r11 = global i32* @v1
 }
 
 @r11 = global i32* @v1
-@r12 = global i32 ()* @f1
+@r12 = global i32 (i8*)* @f1
 
 @a11 = alias i32* @v1
 @a12 = alias bitcast (i32* @v1 to i16*)
 
 
 @a11 = alias i32* @v1
 @a12 = alias bitcast (i32* @v1 to i16*)
 
-@a13 = alias i32 ()* @f1
-@a14 = alias bitcast (i32 ()* @f1 to i16*)
+@a13 = alias i32 (i8*)* @f1
+@a14 = alias bitcast (i32 (i8*)* @f1 to i16*)
 @a15 = alias i16* @a14
 
 ; CHECK: $c1 = comdat any
 @a15 = alias i16* @a14
 
 ; CHECK: $c1 = comdat any
@@ -30,34 +30,35 @@ bb11:
 ; CHECK: @v1 = weak_odr global i32 42, comdat $c1
 
 ; CHECK: @r11 = global i32* @v1{{$}}
 ; CHECK: @v1 = weak_odr global i32 42, comdat $c1
 
 ; CHECK: @r11 = global i32* @v1{{$}}
-; CHECK: @r12 = global i32 ()* @f1{{$}}
+; CHECK: @r12 = global i32 (i8*)* @f1{{$}}
 
 ; CHECK: @r21 = global i32* @v1{{$}}
 
 ; CHECK: @r21 = global i32* @v1{{$}}
-; CHECK: @r22 = global i32 ()* @f1{{$}}
+; CHECK: @r22 = global i32 (i8*)* @f1{{$}}
 
 ; CHECK: @v11 = internal global i32 41, comdat $c2
 
 ; CHECK: @a11 = alias i32* @v1{{$}}
 ; CHECK: @a12 = alias bitcast (i32* @v1 to i16*)
 
 
 ; CHECK: @v11 = internal global i32 41, comdat $c2
 
 ; CHECK: @a11 = alias i32* @v1{{$}}
 ; CHECK: @a12 = alias bitcast (i32* @v1 to i16*)
 
-; CHECK: @a13 = alias i32 ()* @f1{{$}}
-; CHECK: @a14 = alias bitcast (i32 ()* @f1 to i16*)
+; CHECK: @a13 = alias i32 (i8*)* @f1{{$}}
+; CHECK: @a14 = alias bitcast (i32 (i8*)* @f1 to i16*)
 
 ; CHECK: @a21 = alias i32* @v11{{$}}
 ; CHECK: @a22 = alias bitcast (i32* @v11 to i16*)
 
 
 ; CHECK: @a21 = alias i32* @v11{{$}}
 ; CHECK: @a22 = alias bitcast (i32* @v11 to i16*)
 
-; CHECK: @a23 = alias i32 ()* @f12{{$}}
-; CHECK: @a24 = alias bitcast (i32 ()* @f12 to i16*)
+; CHECK: @a23 = alias i32 (i8*)* @f12{{$}}
+; CHECK: @a24 = alias bitcast (i32 (i8*)* @f12 to i16*)
 
 
-; CHECK:      define weak_odr i32 @f1() comdat $c1 {
+; CHECK:      define weak_odr i32 @f1(i8*) comdat $c1 {
 ; CHECK-NEXT: bb10:
 ; CHECK-NEXT:   br label %bb11{{$}}
 ; CHECK:      bb11:
 ; CHECK-NEXT:   ret i32 42
 ; CHECK-NEXT: }
 
 ; CHECK-NEXT: bb10:
 ; CHECK-NEXT:   br label %bb11{{$}}
 ; CHECK:      bb11:
 ; CHECK-NEXT:   ret i32 42
 ; CHECK-NEXT: }
 
-; CHECK:      define internal i32 @f12() comdat $c2 {
+; CHECK:      define internal i32 @f12(i8* %this) comdat $c2 {
 ; CHECK-NEXT: bb20:
 ; CHECK-NEXT: bb20:
+; CHECK-NEXT:   store i8* %this, i8** null
 ; CHECK-NEXT:   br label %bb21
 ; CHECK:      bb21:
 ; CHECK-NEXT:   ret i32 41
 ; CHECK-NEXT:   br label %bb21
 ; CHECK:      bb21:
 ; CHECK-NEXT:   ret i32 41
index a0c678796fa70b51c57735186071a0ea70fecb1b..eb66ab8b0e81ca5d3b1ac02dbcfdbea1abcd7637 100644 (file)
@@ -493,7 +493,21 @@ static GlobalObject *makeInternalReplacement(GlobalObject *GO) {
   if (auto *F = dyn_cast<Function>(GO)) {
     auto *NewF = Function::Create(
         F->getFunctionType(), GlobalValue::InternalLinkage, F->getName(), M);
   if (auto *F = dyn_cast<Function>(GO)) {
     auto *NewF = Function::Create(
         F->getFunctionType(), GlobalValue::InternalLinkage, F->getName(), M);
+
+    ValueToValueMapTy VM;
+    Function::arg_iterator NewI = NewF->arg_begin();
+    for (auto &Arg : F->args()) {
+      NewI->setName(Arg.getName());
+      VM[&Arg] = NewI;
+      ++NewI;
+    }
+
     NewF->getBasicBlockList().splice(NewF->end(), F->getBasicBlockList());
     NewF->getBasicBlockList().splice(NewF->end(), F->getBasicBlockList());
+    for (auto &BB : *NewF) {
+      for (auto &Inst : BB)
+        RemapInstruction(&Inst, VM, RF_IgnoreMissingEntries);
+    }
+
     Ret = NewF;
     F->deleteBody();
   } else {
     Ret = NewF;
     F->deleteBody();
   } else {