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

Commit 3ddd4fa

Browse files
committed
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
1 parent 5307076 commit 3ddd4fa

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

test/tools/gold/Inputs/comdat.ll

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
$c2 = comdat any
22

33
@v1 = weak_odr global i32 41, comdat $c2
4-
define weak_odr i32 @f1() comdat $c2 {
4+
define weak_odr i32 @f1(i8* %this) comdat $c2 {
55
bb20:
6+
store i8* %this, i8** null
67
br label %bb21
78
bb21:
89
ret i32 41
910
}
1011

1112
@r21 = global i32* @v1
12-
@r22 = global i32()* @f1
13+
@r22 = global i32(i8*)* @f1
1314

1415
@a21 = alias i32* @v1
1516
@a22 = alias bitcast (i32* @v1 to i16*)
1617

17-
@a23 = alias i32()* @f1
18-
@a24 = alias bitcast (i32()* @f1 to i16*)
18+
@a23 = alias i32(i8*)* @f1
19+
@a24 = alias bitcast (i32(i8*)* @f1 to i16*)
1920
@a25 = alias i16* @a24

test/tools/gold/comdat.ll

+13-12
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,21 @@
77
$c1 = comdat any
88

99
@v1 = weak_odr global i32 42, comdat $c1
10-
define weak_odr i32 @f1() comdat $c1 {
10+
define weak_odr i32 @f1(i8*) comdat $c1 {
1111
bb10:
1212
br label %bb11
1313
bb11:
1414
ret i32 42
1515
}
1616

1717
@r11 = global i32* @v1
18-
@r12 = global i32 ()* @f1
18+
@r12 = global i32 (i8*)* @f1
1919

2020
@a11 = alias i32* @v1
2121
@a12 = alias bitcast (i32* @v1 to i16*)
2222

23-
@a13 = alias i32 ()* @f1
24-
@a14 = alias bitcast (i32 ()* @f1 to i16*)
23+
@a13 = alias i32 (i8*)* @f1
24+
@a14 = alias bitcast (i32 (i8*)* @f1 to i16*)
2525
@a15 = alias i16* @a14
2626

2727
; CHECK: $c1 = comdat any
@@ -30,34 +30,35 @@ bb11:
3030
; CHECK: @v1 = weak_odr global i32 42, comdat $c1
3131

3232
; CHECK: @r11 = global i32* @v1{{$}}
33-
; CHECK: @r12 = global i32 ()* @f1{{$}}
33+
; CHECK: @r12 = global i32 (i8*)* @f1{{$}}
3434

3535
; CHECK: @r21 = global i32* @v1{{$}}
36-
; CHECK: @r22 = global i32 ()* @f1{{$}}
36+
; CHECK: @r22 = global i32 (i8*)* @f1{{$}}
3737

3838
; CHECK: @v11 = internal global i32 41, comdat $c2
3939

4040
; CHECK: @a11 = alias i32* @v1{{$}}
4141
; CHECK: @a12 = alias bitcast (i32* @v1 to i16*)
4242

43-
; CHECK: @a13 = alias i32 ()* @f1{{$}}
44-
; CHECK: @a14 = alias bitcast (i32 ()* @f1 to i16*)
43+
; CHECK: @a13 = alias i32 (i8*)* @f1{{$}}
44+
; CHECK: @a14 = alias bitcast (i32 (i8*)* @f1 to i16*)
4545

4646
; CHECK: @a21 = alias i32* @v11{{$}}
4747
; CHECK: @a22 = alias bitcast (i32* @v11 to i16*)
4848

49-
; CHECK: @a23 = alias i32 ()* @f12{{$}}
50-
; CHECK: @a24 = alias bitcast (i32 ()* @f12 to i16*)
49+
; CHECK: @a23 = alias i32 (i8*)* @f12{{$}}
50+
; CHECK: @a24 = alias bitcast (i32 (i8*)* @f12 to i16*)
5151

52-
; CHECK: define weak_odr i32 @f1() comdat $c1 {
52+
; CHECK: define weak_odr i32 @f1(i8*) comdat $c1 {
5353
; CHECK-NEXT: bb10:
5454
; CHECK-NEXT: br label %bb11{{$}}
5555
; CHECK: bb11:
5656
; CHECK-NEXT: ret i32 42
5757
; CHECK-NEXT: }
5858

59-
; CHECK: define internal i32 @f12() comdat $c2 {
59+
; CHECK: define internal i32 @f12(i8* %this) comdat $c2 {
6060
; CHECK-NEXT: bb20:
61+
; CHECK-NEXT: store i8* %this, i8** null
6162
; CHECK-NEXT: br label %bb21
6263
; CHECK: bb21:
6364
; CHECK-NEXT: ret i32 41

tools/gold/gold-plugin.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,21 @@ static GlobalObject *makeInternalReplacement(GlobalObject *GO) {
493493
if (auto *F = dyn_cast<Function>(GO)) {
494494
auto *NewF = Function::Create(
495495
F->getFunctionType(), GlobalValue::InternalLinkage, F->getName(), M);
496+
497+
ValueToValueMapTy VM;
498+
Function::arg_iterator NewI = NewF->arg_begin();
499+
for (auto &Arg : F->args()) {
500+
NewI->setName(Arg.getName());
501+
VM[&Arg] = NewI;
502+
++NewI;
503+
}
504+
496505
NewF->getBasicBlockList().splice(NewF->end(), F->getBasicBlockList());
506+
for (auto &BB : *NewF) {
507+
for (auto &Inst : BB)
508+
RemapInstruction(&Inst, VM, RF_IgnoreMissingEntries);
509+
}
510+
497511
Ret = NewF;
498512
F->deleteBody();
499513
} else {

0 commit comments

Comments
 (0)