From fc6b7a0e8a42370525852e47089b920ebd59cc32 Mon Sep 17 00:00:00 2001 From: Stefanus Du Toit Date: Tue, 23 Jul 2013 21:34:03 +0000 Subject: [PATCH] Remove builtin attribute from calls whose targets we replace If we are replacing a function with the nobuiltin attribute, it may be called with the builtin attribute on call sites. Remove any such attributes since it's illegal to have a builtin call to something other than a nobuiltin function. This fixes the current buildbot breakage (where LLDB crashes on "expression new foo(42)"). llvm-svn: 186990 --- lldb/source/Expression/IRForTarget.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lldb/source/Expression/IRForTarget.cpp b/lldb/source/Expression/IRForTarget.cpp index dc27b65..cac3fdf 100644 --- a/lldb/source/Expression/IRForTarget.cpp +++ b/lldb/source/Expression/IRForTarget.cpp @@ -356,6 +356,20 @@ IRForTarget::ResolveFunctionPointers(llvm::Module &llvm_module) if (value_ptr) *value_ptr = value; + + // If we are replacing a function with the nobuiltin attribute, it may + // be called with the builtin attribute on call sites. Remove any such + // attributes since it's illegal to have a builtin call to something + // other than a nobuiltin function. + if (fun->hasFnAttribute(Attribute::NoBuiltin)) { + Attribute builtin = Attribute::get(fun->getContext(), Attribute::Builtin); + + for (auto u = fun->use_begin(), e = fun->use_end(); u != e; ++u) { + if (auto call = dyn_cast(*u)) { + call->removeAttribute(AttributeSet::FunctionIndex, builtin); + } + } + } fun->replaceAllUsesWith(value); } -- 2.7.4