diff options
author | Sami Tolvanen <samitolvanen@google.com> | 2021-08-10 10:02:17 -0700 |
---|---|---|
committer | Sami Tolvanen <samitolvanen@google.com> | 2021-12-20 12:55:32 -0800 |
commit | 5dc8aaac39c53c8e91842a9233921759544759bc (patch) | |
tree | 3e984846bc4ff9321e15efe94762100218a859d6 /llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | |
parent | 02b6fb218e44490f3ea1597e35df1b1b66c6b869 (diff) | |
download | llvm-5dc8aaac39c53c8e91842a9233921759544759bc.zip llvm-5dc8aaac39c53c8e91842a9233921759544759bc.tar.gz llvm-5dc8aaac39c53c8e91842a9233921759544759bc.tar.bz2 |
[llvm][IR] Add no_cfi constant
With Control-Flow Integrity (CFI), the LowerTypeTests pass replaces
function references with CFI jump table references, which is a problem
for low-level code that needs the address of the actual function body.
For example, in the Linux kernel, the code that sets up interrupt
handlers needs to take the address of the interrupt handler function
instead of the CFI jump table, as the jump table may not even be mapped
into memory when an interrupt is triggered.
This change adds the no_cfi constant type, which wraps function
references in a value that LowerTypeTestsModule::replaceCfiUses does not
replace.
Link: https://github.com/ClangBuiltLinux/linux/issues/1353
Reviewed By: nickdesaulniers, pcc
Differential Revision: https://reviews.llvm.org/D108478
Diffstat (limited to 'llvm/lib/Bitcode/Writer/BitcodeWriter.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 1231f9d..dc06bc1 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -2657,6 +2657,10 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal, Code = bitc::CST_CODE_DSO_LOCAL_EQUIVALENT; Record.push_back(VE.getTypeID(Equiv->getGlobalValue()->getType())); Record.push_back(VE.getValueID(Equiv->getGlobalValue())); + } else if (const auto *NC = dyn_cast<NoCFIValue>(C)) { + Code = bitc::CST_CODE_NO_CFI_VALUE; + Record.push_back(VE.getTypeID(NC->getGlobalValue()->getType())); + Record.push_back(VE.getValueID(NC->getGlobalValue())); } else { #ifndef NDEBUG C->dump(); |