Remove builtin attribute from calls whose targets we replace
authorStefanus Du Toit <stefanus.du.toit@intel.com>
Tue, 23 Jul 2013 21:34:03 +0000 (21:34 +0000)
committerStefanus Du Toit <stefanus.du.toit@intel.com>
Tue, 23 Jul 2013 21:34:03 +0000 (21:34 +0000)
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

index dc27b65..cac3fdf 100644 (file)
@@ -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<CallInst>(*u)) {
+                    call->removeAttribute(AttributeSet::FunctionIndex, builtin);
+                }
+            }
+        }
         
         fun->replaceAllUsesWith(value);
     }