summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGCall.cpp
diff options
context:
space:
mode:
authorGuillaume Chatelet <gchatelet@google.com>2019-09-25 11:31:28 +0200
committerGuillaume Chatelet <gchatelet@google.com>2019-10-28 17:30:11 +0100
commitbd87916109483d33455cbf20da2309197b983cdd (patch)
treeeb406f69d0ceb93e07ba90781ca52b69a61e83a6 /clang/lib/CodeGen/CGCall.cpp
parenta062856bcf4fca26dab06afdf14bf1c815831f9c (diff)
downloadbcm5719-llvm-bd87916109483d33455cbf20da2309197b983cdd.tar.gz
bcm5719-llvm-bd87916109483d33455cbf20da2309197b983cdd.zip
[clang] Add no_builtin attribute
Summary: This is a follow up on https://reviews.llvm.org/D61634 This patch is simpler and only adds the no_builtin attribute. Reviewers: tejohnson, courbet, theraven, t.p.northover, jdoerfert Subscribers: mgrang, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D68028
Diffstat (limited to 'clang/lib/CodeGen/CGCall.cpp')
-rw-r--r--clang/lib/CodeGen/CGCall.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index b74f6f94242..62e8fa03701 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -1853,11 +1853,27 @@ void CodeGenModule::ConstructAttributeList(
if (const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
AddAttributesFromFunctionProtoType(
getContext(), FuncAttrs, Fn->getType()->getAs<FunctionProtoType>());
- // Don't use [[noreturn]] or _Noreturn for a call to a virtual function.
- // These attributes are not inherited by overloads.
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Fn);
- if (Fn->isNoReturn() && !(AttrOnCallSite && MD && MD->isVirtual()))
- FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
+ const bool IsVirtualCall = MD && MD->isVirtual();
+ // Don't use [[noreturn]], _Noreturn or [[no_builtin]] for a call to a
+ // virtual function. These attributes are not inherited by overloads.
+ if (!(AttrOnCallSite && IsVirtualCall)) {
+ if (Fn->isNoReturn())
+ FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
+
+ if (const auto *NBA = TargetDecl->getAttr<NoBuiltinAttr>()) {
+ bool HasWildcard = llvm::is_contained(NBA->builtinNames(), "*");
+ if (HasWildcard)
+ FuncAttrs.addAttribute("no-builtins");
+ else
+ for (StringRef BuiltinName : NBA->builtinNames()) {
+ SmallString<32> AttributeName;
+ AttributeName += "no-builtin-";
+ AttributeName += BuiltinName;
+ FuncAttrs.addAttribute(AttributeName);
+ }
+ }
+ }
}
// 'const', 'pure' and 'noalias' attributed functions are also nounwind.
OpenPOWER on IntegriCloud