Skip to content

Commit c4a3b67

Browse files
[codegen] Consider non-opaque pointers when storing indirect addresses
The previous patch was designed to work with upstream LLVM, which has already moved on to opaque pointers. As such, we need to be particularly mindful of the address space in which indirect arguments are placed.
1 parent a42015a commit c4a3b67

File tree

3 files changed

+29
-28
lines changed

3 files changed

+29
-28
lines changed

clang/lib/CodeGen/CGDecl.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2495,18 +2495,6 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, ParamValue Arg,
24952495
auto *V = DeclPtr.getPointer();
24962496
AllocaPtr = DeclPtr;
24972497

2498-
// For truly ABI indirect arguments -- those that are not `byval` -- store
2499-
// the address of the argument on the stack to preserve debug information.
2500-
ABIArgInfo ArgInfo = CurFnInfo->arguments()[ArgNo - 1].info;
2501-
if (ArgInfo.isIndirect())
2502-
UseIndirectDebugAddress = !ArgInfo.getIndirectByVal();
2503-
if (UseIndirectDebugAddress) {
2504-
auto PtrTy = getContext().getPointerType(Ty);
2505-
AllocaPtr = CreateMemTemp(PtrTy, getContext().getTypeAlignInChars(PtrTy),
2506-
D.getName() + ".indirect_addr");
2507-
EmitStoreOfScalar(V, AllocaPtr, /* Volatile */ false, PtrTy);
2508-
}
2509-
25102498
auto SrcLangAS = getLangOpts().OpenCL ? LangAS::opencl_private : AllocaAS;
25112499
auto DestLangAS =
25122500
getLangOpts().OpenCL ? LangAS::opencl_private : LangAS::Default;
@@ -2519,6 +2507,19 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, ParamValue Arg,
25192507
*this, V, SrcLangAS, DestLangAS, T, true));
25202508
}
25212509

2510+
// For truly ABI indirect arguments -- those that are not `byval` -- store
2511+
// the address of the argument on the stack to preserve debug information.
2512+
ABIArgInfo ArgInfo = CurFnInfo->arguments()[ArgNo - 1].info;
2513+
if (ArgInfo.isIndirect())
2514+
UseIndirectDebugAddress = !ArgInfo.getIndirectByVal();
2515+
if (UseIndirectDebugAddress) {
2516+
auto PtrTy = getContext().getPointerType(Ty);
2517+
AllocaPtr = CreateMemTemp(PtrTy, getContext().getTypeAlignInChars(PtrTy),
2518+
D.getName() + ".indirect_addr");
2519+
EmitStoreOfScalar(DeclPtr.getPointer(), AllocaPtr, /* Volatile */ false,
2520+
PtrTy);
2521+
}
2522+
25222523
// Push a destructor cleanup for this parameter if the ABI requires it.
25232524
// Don't push a cleanup in a thunk for a method that will also emit a
25242525
// cleanup.

clang/test/CodeGen/aarch64-ls64.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,13 @@ EXTERN_C void test_ld64b(void)
100100
// CHECK-C-LABEL: @test_st64b(
101101
// CHECK-C-NEXT: entry:
102102
// CHECK-C-NEXT: [[__ADDR_ADDR_I:%.*]] = alloca i8*, align 8
103-
// CHECK-C-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
103+
// CHECK-C-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca [[INDIRECT_ADDR_TY:.*]], align 8
104104
// CHECK-C-NEXT: [[BYVAL_TEMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
105105
// CHECK-C-NEXT: [[TMP0:%.*]] = load i8*, i8** @addr, align 8
106106
// CHECK-C-NEXT: [[TMP1:%.*]] = bitcast %struct.data512_t* [[BYVAL_TEMP]] to i8*
107107
// CHECK-C-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP1]], i8* align 8 bitcast (%struct.data512_t* @val to i8*), i64 64, i1 false)
108108
// CHECK-C-NEXT: store i8* [[TMP0]], i8** [[__ADDR_ADDR_I]], align 8
109-
// CHECK-C-NEXT: store ptr [[BYVAL_TEMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
109+
// CHECK-C-NEXT: store [[INDIRECT_ADDR_TY]] [[BYVAL_TEMP]], [[INDIRECT_ADDR_TY]]* [[VALUE_INDIRECT_ADDR]], align 8
110110
// CHECK-C-NEXT: [[TMP2:%.*]] = load i8*, i8** [[__ADDR_ADDR_I]], align 8
111111
// CHECK-C-NEXT: [[VAL_I:%.*]] = getelementptr inbounds [[STRUCT_DATA512_T]], %struct.data512_t* [[BYVAL_TEMP]], i32 0, i32 0
112112
// CHECK-C-NEXT: [[ARRAYDECAY_I:%.*]] = getelementptr inbounds [8 x i64], [8 x i64]* [[VAL_I]], i64 0, i64 0
@@ -131,13 +131,13 @@ EXTERN_C void test_ld64b(void)
131131
// CHECK-CXX-LABEL: @test_st64b(
132132
// CHECK-CXX-NEXT: entry:
133133
// CHECK-CXX-NEXT: [[__ADDR_ADDR_I:%.*]] = alloca i8*, align 8
134-
// CHECK-CXX-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
134+
// CHECK-CXX-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca [[INDIRECT_ADDR_TY:.*]], align 8
135135
// CHECK-CXX-NEXT: [[AGG_TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
136136
// CHECK-CXX-NEXT: [[TMP0:%.*]] = load i8*, i8** @addr, align 8
137137
// CHECK-CXX-NEXT: [[TMP1:%.*]] = bitcast %struct.data512_t* [[AGG_TMP]] to i8*
138138
// CHECK-CXX-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP1]], i8* align 8 bitcast (%struct.data512_t* @val to i8*), i64 64, i1 false)
139139
// CHECK-CXX-NEXT: store i8* [[TMP0]], i8** [[__ADDR_ADDR_I]], align 8
140-
// CHECK-CXX-NEXT: store ptr [[AGG_TMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
140+
// CHECK-CXX-NEXT: store [[INDIRECT_ADDR_TY]] [[AGG_TMP]], [[INDIRECT_ADDR_TY]]* [[VALUE_INDIRECT_ADDR]], align 8
141141
// CHECK-CXX-NEXT: [[TMP2:%.*]] = load i8*, i8** [[__ADDR_ADDR_I]], align 8
142142
// CHECK-CXX-NEXT: [[VAL_I:%.*]] = getelementptr inbounds [[STRUCT_DATA512_T]], %struct.data512_t* [[AGG_TMP]], i32 0, i32 0
143143
// CHECK-CXX-NEXT: [[ARRAYDECAY_I:%.*]] = getelementptr inbounds [8 x i64], [8 x i64]* [[VAL_I]], i64 0, i64 0
@@ -167,13 +167,13 @@ EXTERN_C void test_st64b(void)
167167
// CHECK-C-LABEL: @test_st64bv(
168168
// CHECK-C-NEXT: entry:
169169
// CHECK-C-NEXT: [[__ADDR_ADDR_I:%.*]] = alloca i8*, align 8
170-
// CHECK-C-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
170+
// CHECK-C-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca [[INDIRECT_ADDR_TY]], align 8
171171
// CHECK-C-NEXT: [[BYVAL_TEMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
172172
// CHECK-C-NEXT: [[TMP0:%.*]] = load i8*, i8** @addr, align 8
173173
// CHECK-C-NEXT: [[TMP1:%.*]] = bitcast %struct.data512_t* [[BYVAL_TEMP]] to i8*
174174
// CHECK-C-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP1]], i8* align 8 bitcast (%struct.data512_t* @val to i8*), i64 64, i1 false)
175175
// CHECK-C-NEXT: store i8* [[TMP0]], i8** [[__ADDR_ADDR_I]], align 8
176-
// CHECK-C-NEXT: store ptr [[BYVAL_TEMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
176+
// CHECK-C-NEXT: store [[INDIRECT_ADDR_TY]] [[BYVAL_TEMP]], [[INDIRECT_ADDR_TY]]* [[VALUE_INDIRECT_ADDR]], align 8
177177
// CHECK-C-NEXT: [[TMP2:%.*]] = load i8*, i8** [[__ADDR_ADDR_I]], align 8
178178
// CHECK-C-NEXT: [[VAL_I:%.*]] = getelementptr inbounds [[STRUCT_DATA512_T]], %struct.data512_t* [[BYVAL_TEMP]], i32 0, i32 0
179179
// CHECK-C-NEXT: [[ARRAYDECAY_I:%.*]] = getelementptr inbounds [8 x i64], [8 x i64]* [[VAL_I]], i64 0, i64 0
@@ -199,13 +199,13 @@ EXTERN_C void test_st64b(void)
199199
// CHECK-CXX-LABEL: @test_st64bv(
200200
// CHECK-CXX-NEXT: entry:
201201
// CHECK-CXX-NEXT: [[__ADDR_ADDR_I:%.*]] = alloca i8*, align 8
202-
// CHECK-CXX-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
202+
// CHECK-CXX-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca [[INDIRECT_ADDR_TY]], align 8
203203
// CHECK-CXX-NEXT: [[AGG_TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
204204
// CHECK-CXX-NEXT: [[TMP0:%.*]] = load i8*, i8** @addr, align 8
205205
// CHECK-CXX-NEXT: [[TMP1:%.*]] = bitcast %struct.data512_t* [[AGG_TMP]] to i8*
206206
// CHECK-CXX-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP1]], i8* align 8 bitcast (%struct.data512_t* @val to i8*), i64 64, i1 false)
207207
// CHECK-CXX-NEXT: store i8* [[TMP0]], i8** [[__ADDR_ADDR_I]], align 8
208-
// CHECK-CXX-NEXT: store ptr [[AGG_TMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
208+
// CHECK-CXX-NEXT: store [[INDIRECT_ADDR_TY]] [[AGG_TMP]], [[INDIRECT_ADDR_TY]]* [[VALUE_INDIRECT_ADDR]], align 8
209209
// CHECK-CXX-NEXT: [[TMP2:%.*]] = load i8*, i8** [[__ADDR_ADDR_I]], align 8
210210
// CHECK-CXX-NEXT: [[VAL_I:%.*]] = getelementptr inbounds [[STRUCT_DATA512_T]], %struct.data512_t* [[AGG_TMP]], i32 0, i32 0
211211
// CHECK-CXX-NEXT: [[ARRAYDECAY_I:%.*]] = getelementptr inbounds [8 x i64], [8 x i64]* [[VAL_I]], i64 0, i64 0
@@ -236,13 +236,13 @@ EXTERN_C void test_st64bv(void)
236236
// CHECK-C-LABEL: @test_st64bv0(
237237
// CHECK-C-NEXT: entry:
238238
// CHECK-C-NEXT: [[__ADDR_ADDR_I:%.*]] = alloca i8*, align 8
239-
// CHECK-C-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
239+
// CHECK-C-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca [[INDIRECT_ADDR_TY]], align 8
240240
// CHECK-C-NEXT: [[BYVAL_TEMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
241241
// CHECK-C-NEXT: [[TMP0:%.*]] = load i8*, i8** @addr, align 8
242242
// CHECK-C-NEXT: [[TMP1:%.*]] = bitcast %struct.data512_t* [[BYVAL_TEMP]] to i8*
243243
// CHECK-C-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP1]], i8* align 8 bitcast (%struct.data512_t* @val to i8*), i64 64, i1 false)
244244
// CHECK-C-NEXT: store i8* [[TMP0]], i8** [[__ADDR_ADDR_I]], align 8
245-
// CHECK-C-NEXT: store ptr [[BYVAL_TEMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
245+
// CHECK-C-NEXT: store [[INDIRECT_ADDR_TY]] [[BYVAL_TEMP]], [[INDIRECT_ADDR_TY]]* [[VALUE_INDIRECT_ADDR]], align 8
246246
// CHECK-C-NEXT: [[TMP2:%.*]] = load i8*, i8** [[__ADDR_ADDR_I]], align 8
247247
// CHECK-C-NEXT: [[VAL_I:%.*]] = getelementptr inbounds [[STRUCT_DATA512_T]], %struct.data512_t* [[BYVAL_TEMP]], i32 0, i32 0
248248
// CHECK-C-NEXT: [[ARRAYDECAY_I:%.*]] = getelementptr inbounds [8 x i64], [8 x i64]* [[VAL_I]], i64 0, i64 0
@@ -268,13 +268,13 @@ EXTERN_C void test_st64bv(void)
268268
// CHECK-CXX-LABEL: @test_st64bv0(
269269
// CHECK-CXX-NEXT: entry:
270270
// CHECK-CXX-NEXT: [[__ADDR_ADDR_I:%.*]] = alloca i8*, align 8
271-
// CHECK-CXX-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
271+
// CHECK-CXX-NEXT: [[VALUE_INDIRECT_ADDR:%.*]] = alloca [[INDIRECT_ADDR_TY]], align 8
272272
// CHECK-CXX-NEXT: [[AGG_TMP:%.*]] = alloca [[STRUCT_DATA512_T:%.*]], align 8
273273
// CHECK-CXX-NEXT: [[TMP0:%.*]] = load i8*, i8** @addr, align 8
274274
// CHECK-CXX-NEXT: [[TMP1:%.*]] = bitcast %struct.data512_t* [[AGG_TMP]] to i8*
275275
// CHECK-CXX-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP1]], i8* align 8 bitcast (%struct.data512_t* @val to i8*), i64 64, i1 false)
276276
// CHECK-CXX-NEXT: store i8* [[TMP0]], i8** [[__ADDR_ADDR_I]], align 8
277-
// CHECK-CXX-NEXT: store ptr [[AGG_TMP]], ptr [[VALUE_INDIRECT_ADDR]], align 8
277+
// CHECK-CXX-NEXT: store [[INDIRECT_ADDR_TY]] [[AGG_TMP]], [[INDIRECT_ADDR_TY]]* [[VALUE_INDIRECT_ADDR]], align 8
278278
// CHECK-CXX-NEXT: [[TMP2:%.*]] = load i8*, i8** [[__ADDR_ADDR_I]], align 8
279279
// CHECK-CXX-NEXT: [[VAL_I:%.*]] = getelementptr inbounds [[STRUCT_DATA512_T]], %struct.data512_t* [[AGG_TMP]], i32 0, i32 0
280280
// CHECK-CXX-NEXT: [[ARRAYDECAY_I:%.*]] = getelementptr inbounds [8 x i64], [8 x i64]* [[VAL_I]], i64 0, i64 0

clang/test/CodeGenCXX/amdgcn-func-arg.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ void func_with_ref_arg(A &a);
1919
void func_with_ref_arg(B &b);
2020

2121
// CHECK-LABEL: @_Z22func_with_indirect_arg1A(
22-
// CHECK-SAME: ptr addrspace(5) noundef [[ARG:%.*]])
22+
// CHECK-SAME: [[INDIRECT_ADDR_TY:.*]] addrspace(5)* noundef [[ARG:%.*]])
2323
// CHECK-NEXT: entry:
24-
// CHECK-NEXT: [[INDIRECT_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
24+
// CHECK-NEXT: [[INDIRECT_ADDR:%.*]] = alloca [[INDIRECT_ADDR_TY]]*, align 8, addrspace(5)
2525
// CHECK-NEXT: [[P:%.*]] = alloca %class.A*, align 8, addrspace(5)
26-
// CHECK-NEXT: [[INDIRECT_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[INDIRECT_ADDR]] to ptr
26+
// CHECK-NEXT: [[INDIRECT_ADDR_ASCAST:%.*]] = addrspacecast [[INDIRECT_ADDR_TY]]* addrspace(5)* [[INDIRECT_ADDR]] to [[INDIRECT_ADDR_TY]]*
2727
// CHECK-NEXT: [[P_ASCAST:%.*]] = addrspacecast %class.A* addrspace(5)* [[P]] to %class.A**
28-
// CHECK-NEXT: store ptr addrspace(5) [[ARG]], ptr [[INDIRECT_ADDR_ASCAST]]
2928
// CHECK-NEXT: [[A_ASCAST:%.*]] = addrspacecast [[CLASS_A:%.*]] addrspace(5)* [[A:%.*]] to %class.A*
29+
// CHECK-NEXT: store [[INDIRECT_ADDR_TY]]* [[A_ASCAST]], [[INDIRECT_ADDR_TY]]** [[INDIRECT_ADDR_ASCAST]]
3030
// CHECK-NEXT: store %class.A* [[A_ASCAST]], %class.A** [[P_ASCAST]], align 8
3131
// CHECK-NEXT: ret void
3232
//

0 commit comments

Comments
 (0)