Use the DataLayout-aware TargetFolder instead of ConstantFolder in Clang's CGBuilder. The primary impact of this change is that GEP constant expressions are now emitted in canonical `getelementptr i8` form. This is in preparation for the migration to ptradd, which requires this form. Part of the test updates were performed by Claude Code and reviewed by me.
37 lines
1.4 KiB
C
37 lines
1.4 KiB
C
// RUN: %clang_cc1 %s -triple arm64e-apple-ios13 -fptrauth-calls -fptrauth-intrinsics -disable-llvm-passes -emit-llvm -o- | FileCheck %s
|
|
// RUN: %clang_cc1 %s -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics -disable-llvm-passes -emit-llvm -o- | FileCheck %s
|
|
// RUN: %clang_cc1 -xc++ %s -triple arm64e-apple-ios13 -fptrauth-calls -fptrauth-intrinsics -disable-llvm-passes -emit-llvm -o- | FileCheck %s --check-prefixes=CHECK,CXX
|
|
// RUN: %clang_cc1 -xc++ %s -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics -disable-llvm-passes -emit-llvm -o- | FileCheck %s --check-prefixes=CHECK,CXX
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void f(void);
|
|
|
|
#ifdef __cplusplus
|
|
|
|
// CXX: define {{(dso_local )?}}internal void @__cxx_global_var_init()
|
|
// CXX: store ptr getelementptr inbounds nuw (i8, ptr ptrauth (ptr @f, i32 0), i64 8), ptr @_ZL2fp, align 8
|
|
|
|
// This is rejected in C mode as adding a non-zero constant to a signed pointer
|
|
// is unrepresentable in relocations. In C++ mode, this can be done dynamically
|
|
// by the global constructor.
|
|
__attribute__((used))
|
|
void (*const fp)(void) = (void (*)(void))((int *)&f + 2);
|
|
|
|
#endif
|
|
|
|
// CHECK: define {{(dso_local )?}}void @t1()
|
|
void t1() {
|
|
// CHECK: [[PF:%.*]] = alloca ptr
|
|
// CHECK: store ptr getelementptr inbounds nuw (i8, ptr ptrauth (ptr @f, i32 0), i64 8), ptr [[PF]]
|
|
|
|
void (*pf)(void) = (void (*)(void))((int *)&f + 2);
|
|
(void)pf;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|