diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-10-31 22:28:10 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-10-31 22:28:10 +0000 |
commit | f794b058f62d515393511e1053dbed78fd92d9ee (patch) | |
tree | bdb506516499d71b1dfa6f730c9a05aa07d2bd01 /lib/CodeGen/CodeGenModule.cpp | |
parent | e30072cab95f2538755e30383349e91e20750eca (diff) | |
download | clang-f794b058f62d515393511e1053dbed78fd92d9ee.tar.gz |
[cfi] Fix missing !type annotation.
CFI (only in the cross-dso mode) fails to set !type annotations when
a function is used before it is defined.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285650 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 81d9ead3d1..291ff8ed57 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -929,6 +929,11 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, if (F->getAlignment() < 2 && isa<CXXMethodDecl>(D)) F->setAlignment(2); } + + // In the cross-dso CFI mode, we want !type attributes on definitions only. + if (CodeGenOpts.SanitizeCfiCrossDso) + if (auto *FD = dyn_cast<FunctionDecl>(D)) + CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::SetCommonAttributes(const Decl *D, @@ -1011,10 +1016,6 @@ void CodeGenModule::CreateFunctionTypeMetadata(const FunctionDecl *FD, // Additionally, if building with cross-DSO support... if (CodeGenOpts.SanitizeCfiCrossDso) { - // Don't emit entries for function declarations. In cross-DSO mode these are - // handled with better precision at run time. - if (!FD->hasBody()) - return; // Skip available_externally functions. They won't be codegen'ed in the // current module anyway. if (getContext().GetGVALinkageForFunction(FD) == GVA_AvailableExternally) @@ -1087,7 +1088,10 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F, if (MD->isVirtual()) F->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - CreateFunctionTypeMetadata(FD, F); + // Don't emit entries for function declarations in the cross-DSO mode. This + // is handled with better precision by the receiving DSO. + if (!CodeGenOpts.SanitizeCfiCrossDso) + CreateFunctionTypeMetadata(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { |