diff options
author | Sami Tolvanen <samitolvanen@users.noreply.github.com> | 2024-08-20 16:51:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-20 16:51:16 -0700 |
commit | e1c36bde0551977d4b2efae032af6dfc4b2b3936 (patch) | |
tree | d029ba7b43a1e89956f515e3f43b9212fca69bdd /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 3145cff24bda61ae0d3ba3981c19599f12af95ab (diff) | |
download | llvm-e1c36bde0551977d4b2efae032af6dfc4b2b3936.zip llvm-e1c36bde0551977d4b2efae032af6dfc4b2b3936.tar.gz llvm-e1c36bde0551977d4b2efae032af6dfc4b2b3936.tar.bz2 |
Fix KCFI types for generated functions with integer normalization (#104826)
With -fsanitize-cfi-icall-experimental-normalize-integers, Clang
appends ".normalized" to KCFI types in CodeGenModule::CreateKCFITypeId,
which changes type hashes also for functions that don't have integer
types in their signatures. However, llvm::setKCFIType does not take
integer normalization into account, which means LLVM generated
functions with KCFI types, e.g. sanitizer constructors, will fail KCFI
checks when integer normalization is enabled in Clang.
Add a cfi-normalize-integers module flag to indicate integer
normalization is used, and append ".normalized" to KCFI types also in
llvm::setKCFIType to fix the type mismatch.
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 0b61ef0..0d3b896 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1134,6 +1134,11 @@ void CodeGenModule::Release() { CodeGenOpts.SanitizeCfiCanonicalJumpTables); } + if (CodeGenOpts.SanitizeCfiICallNormalizeIntegers) { + getModule().addModuleFlag(llvm::Module::Override, "cfi-normalize-integers", + 1); + } + if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) { getModule().addModuleFlag(llvm::Module::Override, "kcfi", 1); // KCFI assumes patchable-function-prefix is the same for all indirectly |