From: Rafael Espindola Date: Tue, 7 Oct 2014 00:47:38 +0000 (+0000) Subject: gold plugin: Remap function arguments when creating a replacement function. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=3ddd4fa0ddf1fb9154a9a171dba58c1a3e551362 gold plugin: Remap function arguments when creating a replacement function. 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 --- diff --git a/test/tools/gold/Inputs/comdat.ll b/test/tools/gold/Inputs/comdat.ll index b9a639a7ff0..4767fe78796 100644 --- a/test/tools/gold/Inputs/comdat.ll +++ b/test/tools/gold/Inputs/comdat.ll @@ -1,19 +1,20 @@ $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: + store i8* %this, i8** null 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*) -@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 diff --git a/test/tools/gold/comdat.ll b/test/tools/gold/comdat.ll index cb8599e0cf0..7b1fbd617c0 100644 --- a/test/tools/gold/comdat.ll +++ b/test/tools/gold/comdat.ll @@ -7,7 +7,7 @@ $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: @@ -15,13 +15,13 @@ bb11: } @r11 = global i32* @v1 -@r12 = global i32 ()* @f1 +@r12 = global i32 (i8*)* @f1 @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 @@ -30,34 +30,35 @@ bb11: ; 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: @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: @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: @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: define internal i32 @f12() comdat $c2 { +; CHECK: define internal i32 @f12(i8* %this) comdat $c2 { ; CHECK-NEXT: bb20: +; CHECK-NEXT: store i8* %this, i8** null ; CHECK-NEXT: br label %bb21 ; CHECK: bb21: ; CHECK-NEXT: ret i32 41 diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index a0c678796fa..eb66ab8b0e8 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -493,7 +493,21 @@ static GlobalObject *makeInternalReplacement(GlobalObject *GO) { if (auto *F = dyn_cast(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()); + for (auto &BB : *NewF) { + for (auto &Inst : BB) + RemapInstruction(&Inst, VM, RF_IgnoreMissingEntries); + } + Ret = NewF; F->deleteBody(); } else {