https://github.com/Luhaocong created https://github.com/llvm/llvm-project/pull/171974
Part of https://github.com/llvm/llvm-project/issues/167765 >From 5878e4175a7d7b7149f4010c1508214b15bf3f3b Mon Sep 17 00:00:00 2001 From: Haocong Lu <[email protected]> Date: Fri, 12 Dec 2025 13:55:59 +0800 Subject: [PATCH] [CIR][X86] Implement lowering for `_AddressOfReturnAddress` builtin --- clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp | 7 +++- clang/test/CIR/CodeGen/ms-intrinsics.c | 40 ++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 clang/test/CIR/CodeGen/ms-intrinsics.c diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp index f9e1f75a51143..5b6e0537c32d1 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp @@ -1706,7 +1706,12 @@ CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID, const CallExpr *expr) { cir::SyncScopeKind::SingleThread)); return mlir::Value{}; } - case X86::BI_AddressOfReturnAddress: + case X86::BI_AddressOfReturnAddress: { + mlir::Location loc = getLoc(expr->getExprLoc()); + mlir::Value addr = emitIntrinsicCallOp( + builder, loc, "addressofreturnaddress", allocaInt8PtrTy); + return builder.createCast(loc, cir::CastKind::bitcast, addr, voidPtrTy); + } case X86::BI__stosb: case X86::BI__ud2: case X86::BI__int2c: diff --git a/clang/test/CIR/CodeGen/ms-intrinsics.c b/clang/test/CIR/CodeGen/ms-intrinsics.c new file mode 100644 index 0000000000000..0d07db2beac46 --- /dev/null +++ b/clang/test/CIR/CodeGen/ms-intrinsics.c @@ -0,0 +1,40 @@ +// RUN: %clang_cc1 -x c -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \ +// RUN: -triple x86_64-unknown-linux -Wno-implicit-function-declaration -fclangir -emit-cir -o %t.cir %s +// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s +// RUN: %clang_cc1 -x c++ -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \ +// RUN: -triple x86_64-unknown-linux -Wno-implicit-function-declaration -fclangir -emit-cir -o %t.cir %s +// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s + +// RUN: %clang_cc1 -x c -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \ +// RUN: -triple x86_64-unknown-linux -Wno-implicit-function-declaration -fclangir -emit-llvm -o %t.ll %s +// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s +// RUN: %clang_cc1 -x c++ -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \ +// RUN: -triple x86_64-unknown-linux -Wno-implicit-function-declaration -fclangir -emit-llvm -o %t.ll %s +// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s + +// RUN: %clang_cc1 -x c -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \ +// RUN: -triple x86_64-unknown-linux -emit-llvm -Wall -Werror %s -o - \ +// RUN: | FileCheck %s -check-prefix=OGCG +// RUN: %clang_cc1 -x c++ -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \ +// RUN: -triple x86_64-unknown-linux -emit-llvm -Wall -Werror %s -o - \ +// RUN: | FileCheck %s -check-prefix=OGCG + +// This test mimics clang/test/CodeGen/ms-intrinsics.c, which eventually +// CIR shall be able to support fully. + +void *_AddressOfReturnAddress(void); + +#if defined(__i386__) || defined(__x86_64__) || defined (__aarch64__) +void *test_AddressOfReturnAddress(void) { + // CIR-LABEL: test_AddressOfReturnAddress + // CIR: %[[ADDR:.*]] = cir.call_llvm_intrinsic "addressofreturnaddress" : () -> !cir.ptr<!u8i> + // CIR: %{{.*}} = cir.cast bitcast %[[ADDR]] : !cir.ptr<!u8i> -> !cir.ptr<!void> + + // LLVM-LABEL: test_AddressOfReturnAddress + // LLVM: call ptr @llvm.addressofreturnaddress.p0() + + // OGCG-LABEL: test_AddressOfReturnAddress + // OGCG: call ptr @llvm.addressofreturnaddress.p0() + return _AddressOfReturnAddress(); +} +#endif _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
