Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
gold plugin: Remap function arguments when creating a replacement fun…
Browse files Browse the repository at this point in the history
…ction.

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
  • Loading branch information
espindola committed Oct 7, 2014
1 parent 5307076 commit 3ddd4fa
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 16 deletions.
9 changes: 5 additions & 4 deletions test/tools/gold/Inputs/comdat.ll
Original file line number Diff line number Diff line change
@@ -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
25 changes: 13 additions & 12 deletions test/tools/gold/comdat.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@
$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:
ret i32 42
}

@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
Expand All @@ -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
Expand Down
14 changes: 14 additions & 0 deletions tools/gold/gold-plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

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 {
Expand Down

0 comments on commit 3ddd4fa

Please sign in to comment.