diff options
author | Bill Wendling <isanbard@gmail.com> | 2022-02-08 17:40:59 -0800 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2022-02-08 17:42:54 -0800 |
commit | deaf22bc0e306bc44c70d2503e9364b5ed312c49 (patch) | |
tree | 180a857a884a7ac508577fc0b2bcd69f078c328b /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | dc8f4e118d92982ff5f6316fe7d541d120ebabd1 (diff) | |
download | llvm-deaf22bc0e306bc44c70d2503e9364b5ed312c49.zip llvm-deaf22bc0e306bc44c70d2503e9364b5ed312c49.tar.gz llvm-deaf22bc0e306bc44c70d2503e9364b5ed312c49.tar.bz2 |
[X86] Implement -fzero-call-used-regs option
The "-fzero-call-used-regs" option tells the compiler to zero out
certain registers before the function returns. It's also available as a
function attribute: zero_call_used_regs.
The two upper categories are:
- "used": Zero out used registers.
- "all": Zero out all registers, whether used or not.
The individual options are:
- "skip": Don't zero out any registers. This is the default.
- "used": Zero out all used registers.
- "used-arg": Zero out used registers that are used for arguments.
- "used-gpr": Zero out used registers that are GPRs.
- "used-gpr-arg": Zero out used GPRs that are used as arguments.
- "all": Zero out all registers.
- "all-arg": Zero out all registers used for arguments.
- "all-gpr": Zero out all GPRs.
- "all-gpr-arg": Zero out all GPRs used for arguments.
This is used to help mitigate Return-Oriented Programming exploits.
Reviewed By: nickdesaulniers
Differential Revision: https://reviews.llvm.org/D110869
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 50e1638..ba07765 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -981,6 +981,10 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, CGM.getCodeGenOpts().StackAlignment)) Fn->addFnAttr("stackrealign"); + // "main" doesn't need to zero out call-used registers. + if (FD && FD->isMain()) + Fn->removeFnAttr("zero-call-used-regs"); + llvm::BasicBlock *EntryBB = createBasicBlock("entry", CurFn); // Create a marker to make it easy to insert allocas into the entryblock |