Skip to content

Commit d2c4812

Browse files
committed
add bitcast
1 parent 5ee4534 commit d2c4812

File tree

4 files changed

+41
-11
lines changed

4 files changed

+41
-11
lines changed

clang/lib/CIR/CodeGen/CIRGenExpr.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,27 @@ RValue CIRGenFunction::buildCall(clang::QualType CalleeType,
11451145
if (isa<FunctionNoProtoType>(FnType) || Chain) {
11461146
assert(!UnimplementedFeature::chainCalls());
11471147
assert(!UnimplementedFeature::addressSpace());
1148+
auto CalleeTy = getTypes().GetFunctionType(FnInfo);
1149+
// get non-variadic function type
1150+
CalleeTy = mlir::cir::FuncType::get(CalleeTy.getInputs(),
1151+
CalleeTy.getReturnType(), false);
1152+
auto CalleePtrTy =
1153+
mlir::cir::PointerType::get(builder.getContext(), CalleeTy);
1154+
1155+
auto *Fn = Callee.getFunctionPointer();
1156+
mlir::Value Addr;
1157+
if (auto funcOp = llvm::dyn_cast<mlir::cir::FuncOp>(Fn)) {
1158+
Addr = builder.create<mlir::cir::GetGlobalOp>(
1159+
getLoc(E->getSourceRange()),
1160+
mlir::cir::PointerType::get(builder.getContext(),
1161+
funcOp.getFunctionType()),
1162+
funcOp.getSymName());
1163+
} else {
1164+
Addr = Fn->getResult(0);
1165+
}
1166+
1167+
Fn = builder.createBitcast(Addr, CalleePtrTy).getDefiningOp();
1168+
Callee.setFunctionPointer(Fn);
11481169
}
11491170

11501171
assert(!CGM.getLangOpts().HIP && "HIP NYI");

clang/test/CIR/CodeGen/agg-copy.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ void foo4(A* a1) {
6464
A create() { A a; return a; }
6565

6666
// CHECK: cir.func {{.*@foo5}}
67-
// CHECK: [[TMP0]] = cir.alloca !ty_22A22, cir.ptr <!ty_22A22>,
68-
// CHECK: [[TMP1]] = cir.alloca !ty_22A22, cir.ptr <!ty_22A22>, ["tmp"] {alignment = 4 : i64}
69-
// CHECK: [[TMP2]] = cir.call @create() : () -> !ty_22A22
67+
// CHECK: [[TMP0:%.*]] = cir.alloca !ty_22A22, cir.ptr <!ty_22A22>,
68+
// CHECK: [[TMP1:%.*]] = cir.alloca !ty_22A22, cir.ptr <!ty_22A22>, ["tmp"] {alignment = 4 : i64}
69+
// CHECK: [[TMP2:%.*]] = cir.call @create() : () -> !ty_22A22
7070
// CHECK: cir.store [[TMP2]], [[TMP1]] : !ty_22A22, cir.ptr <!ty_22A22>
7171
// CHECK: cir.copy [[TMP1]] to [[TMP0]] : !cir.ptr<!ty_22A22>
7272
void foo5() {
@@ -77,9 +77,9 @@ void foo5() {
7777
void foo6(A* a1) {
7878
A a2 = (*a1);
7979
// CHECK: cir.func {{.*@foo6}}
80-
// CHECK: [[TMP0]] = cir.alloca !cir.ptr<!ty_22A22>, cir.ptr <!cir.ptr<!ty_22A22>>, ["a1", init] {alignment = 8 : i64}
81-
// CHECK: [[TMP1]] = cir.alloca !ty_22A22, cir.ptr <!ty_22A22>, ["a2", init] {alignment = 4 : i64}
80+
// CHECK: [[TMP0:%.*]] = cir.alloca !cir.ptr<!ty_22A22>, cir.ptr <!cir.ptr<!ty_22A22>>, ["a1", init] {alignment = 8 : i64}
81+
// CHECK: [[TMP1:%.*]] = cir.alloca !ty_22A22, cir.ptr <!ty_22A22>, ["a2", init] {alignment = 4 : i64}
8282
// CHECK: cir.store %arg0, [[TMP0]] : !cir.ptr<!ty_22A22>, cir.ptr <!cir.ptr<!ty_22A22>>
83-
// CHECK: [[TMP2]] = cir.load deref [[TMP0]] : cir.ptr <!cir.ptr<!ty_22A22>>, !cir.ptr<!ty_22A22>
83+
// CHECK: [[TMP2:%.*]] = cir.load deref [[TMP0]] : cir.ptr <!cir.ptr<!ty_22A22>>, !cir.ptr<!ty_22A22>
8484
// CHECK: cir.copy [[TMP2]] to [[TMP1]] : !cir.ptr<!ty_22A22>
8585
}

clang/test/CIR/CodeGen/no-proto-fun-ptr.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ void buz() {
2323
// CHECK: cir.func no_proto @buz()
2424
// CHECK: [[FNPTR_ALLOC:%.*]] = cir.alloca !cir.ptr<!cir.func<!void (...)>>, cir.ptr <!cir.ptr<!cir.func<!void (...)>>>, ["func"] {alignment = 8 : i64}
2525
// CHECK: [[FNPTR:%.*]] = cir.load deref [[FNPTR_ALLOC]] : cir.ptr <!cir.ptr<!cir.func<!void (...)>>>, !cir.ptr<!cir.func<!void (...)>>
26-
// CHECK: cir.call [[FNPTR]]() : (!cir.ptr<!cir.func<!void (...)>>) -> ()
26+
// CHECK: [[CAST:%.*]] = cir.cast(bitcast, %1 : !cir.ptr<!cir.func<!void (...)>>), !cir.ptr<!cir.func<!void ()>>
27+
// CHECK: cir.call [[CAST]]() : (!cir.ptr<!cir.func<!void ()>>) -> ()
2728
// CHECK: cir.return

clang/test/CIR/CodeGen/no-prototype.c

+12-4
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ int test1(int x) {
3535
int noProto2();
3636
int test2(int x) {
3737
return noProto2(x);
38-
// CHECK: %{{.+}} = cir.call @noProto2(%{{[0-9]+}}) : (!s32i) -> !s32i
38+
// CHECK: [[GGO:%.*]] = cir.get_global @noProto2 : cir.ptr <!cir.func<!s32i (!s32i)>>
39+
// CHECK: [[CAST:%.*]] = cir.cast(bitcast, %3 : !cir.ptr<!cir.func<!s32i (!s32i)>>), !cir.ptr<!cir.func<!s32i (!s32i)>>
40+
// CHECK: {{.*}} = cir.call [[CAST]](%{{[0-9]+}}) : (!cir.ptr<!cir.func<!s32i (!s32i)>>, !s32i) -> !s32i
3941
}
4042
int noProto2(int x) { return x; }
4143
// CHECK: cir.func no_proto @noProto2(%arg0: !s32i {{.+}}) -> !s32i
@@ -49,7 +51,9 @@ int noProto3();
4951
int test3(int x) {
5052
// CHECK: cir.func @test3
5153
return noProto3(x);
52-
// CHECK: %{{.+}} = cir.call @noProto3(%{{[0-9]+}}) : (!s32i) -> !s32i
54+
// CHECK: [[GGO:%.*]] = cir.get_global @noProto3 : cir.ptr <!cir.func<!s32i (...)>>
55+
// CHECK: [[CAST:%.*]] = cir.cast(bitcast, [[GGO]] : !cir.ptr<!cir.func<!s32i (...)>>), !cir.ptr<!cir.func<!s32i (!s32i)>>
56+
// CHECK: {{%.*}} = cir.call [[CAST]](%{{[0-9]+}}) : (!cir.ptr<!cir.func<!s32i (!s32i)>>, !s32i) -> !s32i
5357
}
5458

5559

@@ -64,14 +68,18 @@ int noProto4() { return 0; }
6468
// cir.func private no_proto @noProto4() -> !s32i
6569
int test4(int x) {
6670
return noProto4(x); // Even if we know the definition, this should compile.
67-
// CHECK: %{{.+}} = cir.call @noProto4(%{{.+}}) : (!s32i) -> !s32i
71+
// CHECK: [[GGO:%.*]] = cir.get_global @noProto4 : cir.ptr <!cir.func<!s32i ()>>
72+
// CHECK: [[CAST:%.*]] = cir.cast(bitcast, [[GGO]] : !cir.ptr<!cir.func<!s32i ()>>), !cir.ptr<!cir.func<!s32i (!s32i)>>
73+
// CHECK: {{%.*}} = cir.call [[CAST]]({{%.*}}) : (!cir.ptr<!cir.func<!s32i (!s32i)>>, !s32i) -> !s32i
6874
}
6975

7076
// No-proto definition followed by an incorrect call due to lack of args.
7177
int noProto5();
7278
int test5(int x) {
7379
return noProto5();
74-
// CHECK: %{{.+}} = cir.call @noProto5() : () -> !s32i
80+
// CHECK: [[GGO:%.*]] = cir.get_global @noProto5 : cir.ptr <!cir.func<!s32i (!s32i)>>
81+
// CHECK: [[CAST:%.*]] = cir.cast(bitcast, [[GGO]] : !cir.ptr<!cir.func<!s32i (!s32i)>>), !cir.ptr<!cir.func<!s32i ()>>
82+
// CHECK: {{%.*}} = cir.call [[CAST]]() : (!cir.ptr<!cir.func<!s32i ()>>) -> !s32i
7583
}
7684
int noProto5(int x) { return x; }
7785
// CHECK: cir.func no_proto @noProto5(%arg0: !s32i {{.+}}) -> !s32i

0 commit comments

Comments
 (0)