diff options
author | Fangrui Song <i@maskray.me> | 2021-04-22 18:07:29 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2021-04-22 18:07:30 -0700 |
commit | 2786e673c7d67ffca531ef38d679620ee3048a1e (patch) | |
tree | bfa8a40a80741ad2fd9565e50be742b9ad70bc4a /llvm/lib/IR/Module.cpp | |
parent | 879cbac08ba17566ad61ff2b9d7180bcab4a0d1e (diff) | |
download | llvm-2786e673c7d67ffca531ef38d679620ee3048a1e.zip llvm-2786e673c7d67ffca531ef38d679620ee3048a1e.tar.gz llvm-2786e673c7d67ffca531ef38d679620ee3048a1e.tar.bz2 |
[IR][sanitizer] Add module flag "frame-pointer" and set it for cc1 -mframe-pointer={non-leaf,all}
The Linux kernel objtool diagnostic `call without frame pointer save/setup`
arise in multiple instrumentation passes (asan/tsan/gcov). With the mechanism
introduced in D100251, it's trivial to respect the command line
-m[no-]omit-leaf-frame-pointer/-f[no-]omit-frame-pointer, so let's do it.
Fix: https://github.com/ClangBuiltLinux/linux/issues/1236 (tsan)
Fix: https://github.com/ClangBuiltLinux/linux/issues/1238 (asan)
Also document the function attribute "frame-pointer" which is long overdue.
Differential Revision: https://reviews.llvm.org/D101016
Diffstat (limited to 'llvm/lib/IR/Module.cpp')
-rw-r--r-- | llvm/lib/IR/Module.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index b5108f7..726ac6a 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -676,6 +676,16 @@ bool Module::getUwtable() const { void Module::setUwtable() { addModuleFlag(ModFlagBehavior::Max, "uwtable", 1); } +FramePointerKind Module::getFramePointer() const { + auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("frame-pointer")); + return static_cast<FramePointerKind>( + Val ? cast<ConstantInt>(Val->getValue())->getZExtValue() : 0); +} + +void Module::setFramePointer(FramePointerKind Kind) { + addModuleFlag(ModFlagBehavior::Max, "frame-pointer", static_cast<int>(Kind)); +} + void Module::setSDKVersion(const VersionTuple &V) { SmallVector<unsigned, 3> Entries; Entries.push_back(V.getMajor()); |