Skip to content

Commit 3df2b3a

Browse files
author
git apple-llvm automerger
committed
Merge commit 'def7925c4833' from llvm.org/release/19.x into stable/20240723
2 parents 114bf8c + def7925 commit 3df2b3a

File tree

5 files changed

+53
-8
lines changed

5 files changed

+53
-8
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,6 +1138,11 @@ void CodeGenModule::Release() {
11381138
CodeGenOpts.SanitizeCfiCanonicalJumpTables);
11391139
}
11401140

1141+
if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) {
1142+
getModule().addModuleFlag(llvm::Module::Override, "cfi-normalize-integers",
1143+
1);
1144+
}
1145+
11411146
if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {
11421147
getModule().addModuleFlag(llvm::Module::Override, "kcfi", 1);
11431148
// KCFI assumes patchable-function-prefix is the same for all indirectly

clang/test/CodeGen/kcfi-normalize.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ void baz(void (*fn)(int, int, int), int arg1, int arg2, int arg3) {
2828
fn(arg1, arg2, arg3);
2929
}
3030

31+
// CHECK: ![[#]] = !{i32 4, !"cfi-normalize-integers", i32 1}
3132
// CHECK: ![[TYPE1]] = !{i32 -1143117868}
3233
// CHECK: ![[TYPE2]] = !{i32 -460921415}
3334
// CHECK: ![[TYPE3]] = !{i32 -333839615}

llvm/lib/Transforms/Utils/ModuleUtils.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,13 @@ void llvm::setKCFIType(Module &M, Function &F, StringRef MangledType) {
199199
// Matches CodeGenModule::CreateKCFITypeId in Clang.
200200
LLVMContext &Ctx = M.getContext();
201201
MDBuilder MDB(Ctx);
202-
F.setMetadata(
203-
LLVMContext::MD_kcfi_type,
204-
MDNode::get(Ctx, MDB.createConstant(ConstantInt::get(
205-
Type::getInt32Ty(Ctx),
206-
static_cast<uint32_t>(xxHash64(MangledType))))));
202+
std::string Type = MangledType.str();
203+
if (M.getModuleFlag("cfi-normalize-integers"))
204+
Type += ".normalized";
205+
F.setMetadata(LLVMContext::MD_kcfi_type,
206+
MDNode::get(Ctx, MDB.createConstant(ConstantInt::get(
207+
Type::getInt32Ty(Ctx),
208+
static_cast<uint32_t>(xxHash64(Type))))));
207209
// If the module was compiled with -fpatchable-function-entry, ensure
208210
// we use the same patchable-function-prefix.
209211
if (auto *MD = mdconst::extract_or_null<ConstantInt>(
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
;; Ensure __llvm_gcov_(writeout|reset|init) have the correct !kcfi_type
2+
;; with integer normalization.
3+
; RUN: mkdir -p %t && cd %t
4+
; RUN: opt < %s -S -passes=insert-gcov-profiling | FileCheck %s
5+
6+
target triple = "x86_64-unknown-linux-gnu"
7+
8+
define dso_local void @empty() !dbg !5 {
9+
entry:
10+
ret void, !dbg !8
11+
}
12+
13+
!llvm.dbg.cu = !{!0}
14+
!llvm.module.flags = !{!3, !4, !9, !10}
15+
16+
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, emissionKind: FullDebug, enums: !2)
17+
!1 = !DIFile(filename: "a.c", directory: "")
18+
!2 = !{}
19+
!3 = !{i32 7, !"Dwarf Version", i32 5}
20+
!4 = !{i32 2, !"Debug Info Version", i32 3}
21+
!5 = distinct !DISubprogram(name: "empty", scope: !1, file: !1, line: 1, type: !6, scopeLine: 1, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
22+
!6 = !DISubroutineType(types: !7)
23+
!7 = !{null}
24+
!8 = !DILocation(line: 2, column: 1, scope: !5)
25+
!9 = !{i32 4, !"kcfi", i32 1}
26+
!10 = !{i32 4, !"cfi-normalize-integers", i32 1}
27+
28+
; CHECK: define internal void @__llvm_gcov_writeout()
29+
; CHECK-SAME: !kcfi_type ![[#TYPE:]]
30+
; CHECK: define internal void @__llvm_gcov_reset()
31+
; CHECK-SAME: !kcfi_type ![[#TYPE]]
32+
; CHECK: define internal void @__llvm_gcov_init()
33+
; CHECK-SAME: !kcfi_type ![[#TYPE]]
34+
35+
; CHECK: ![[#TYPE]] = !{i32 -440107680}

llvm/test/Transforms/GCOVProfiling/kcfi.ll

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ entry:
2424
!9 = !{i32 4, !"kcfi", i32 1}
2525

2626
; CHECK: define internal void @__llvm_gcov_writeout()
27-
; CHECK-SAME: !kcfi_type
27+
; CHECK-SAME: !kcfi_type ![[#TYPE:]]
2828
; CHECK: define internal void @__llvm_gcov_reset()
29-
; CHECK-SAME: !kcfi_type
29+
; CHECK-SAME: !kcfi_type ![[#TYPE]]
3030
; CHECK: define internal void @__llvm_gcov_init()
31-
; CHECK-SAME: !kcfi_type
31+
; CHECK-SAME: !kcfi_type ![[#TYPE]]
32+
33+
; CHECK: ![[#TYPE]] = !{i32 -1522505972}

0 commit comments

Comments
 (0)