Skip to content

Commit 107dcbc

Browse files
committed
Support __builtin_frame_address
1 parent ff4a35e commit 107dcbc

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,18 +1592,21 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
15921592
llvm_unreachable("BI__builtin_wmemcmp NYI");
15931593
case Builtin::BI__builtin_dwarf_cfa:
15941594
llvm_unreachable("BI__builtin_dwarf_cfa NYI");
1595-
case Builtin::BI__builtin_return_address: {
1595+
case Builtin::BI__builtin_return_address:
1596+
case Builtin::BI__builtin_frame_address: {
15961597
mlir::Location loc = getLoc(E->getExprLoc());
15971598
mlir::Attribute levelAttr = ConstantEmitter(*this).emitAbstract(
15981599
E->getArg(0), E->getArg(0)->getType());
15991600
int64_t level = mlir::cast<cir::IntAttr>(levelAttr).getSInt();
16001601
return RValue::get(builder.create<cir::FuncAddrBuiltinOp>(
1601-
loc, cir::FuncAddrKind::return_address, builder.getUInt32(level, loc)));
1602+
loc,
1603+
BuiltinID == Builtin::BI__builtin_return_address
1604+
? cir::FuncAddrKind::return_address
1605+
: cir::FuncAddrKind::frame_address,
1606+
builder.getUInt32(level, loc)));
16021607
}
16031608
case Builtin::BI_ReturnAddress:
16041609
llvm_unreachable("BI_ReturnAddress NYI");
1605-
case Builtin::BI__builtin_frame_address:
1606-
llvm_unreachable("BI__builtin_frame_address NYI");
16071610
case Builtin::BI__builtin_extract_return_addr:
16081611
llvm_unreachable("BI__builtin_extract_return_addr NYI");
16091612
case Builtin::BI__builtin_frob_return_addr:

clang/test/CIR/CodeGen/builtins.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,14 @@ extern "C" void *test_return_address(void) {
105105
// LLVM-LABEL: @test_return_address
106106
// LLVM: {{%.*}} = call ptr @llvm.returnaddress(i32 1)
107107
}
108+
109+
extern "C" void *test_frame_address(void) {
110+
return __builtin_frame_address(1);
111+
112+
// CIR-LABEL: test_frame_address
113+
// CIR: [[ARG:%.*]] = cir.const #cir.int<1> : !u32i
114+
// CIR: {{%.*}} = cir.func_addr_builtin(frame_address, [[ARG]])
115+
116+
// LLVM-LABEL: @test_frame_address
117+
// LLVM: {{%.*}} = call ptr @llvm.frameaddress.p0(i32 1)
118+
}

clang/test/CIR/IR/builtins.cir

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ module {
55
cir.func @test1() {
66
%0 = cir.const #cir.int<1> : !u32i
77
%1 = cir.func_addr_builtin(return_address, %0)
8+
%2 = cir.func_addr_builtin(frame_address, %0)
89
cir.return
910
}
1011
// CHECK: cir.func @test1()
1112
// CHECK: %0 = cir.const #cir.int<1> : !u32i
1213
// CHECK: %1 = cir.func_addr_builtin(return_address, %0)
14+
// CHECK: %2 = cir.func_addr_builtin(frame_address, %0)
1315
// CHECK: cir.return
1416
}

0 commit comments

Comments
 (0)