Commit 156dd006 authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r183153:

------------------------------------------------------------------------
r183153 | dmalea | 2013-06-03 13:45:54 -0700 (Mon, 03 Jun 2013) | 7 lines

Fix crash (in optimized builds) due to invalid metadata operand
- ConstantDataArray is not a valid MDNode operand
- encode function-name strings in metadata by wrapping in an MDString instead

- should resolve reported by http://llvm-jenkins.debian.net/job/llvm-toolchain-quantal-binaries/architecture=amd64,distribution=quantal/173/


------------------------------------------------------------------------

llvm-svn: 183191
parent c89859f4
Loading
Loading
Loading
Loading
+4 −11
Original line number Diff line number Diff line
@@ -517,23 +517,16 @@ private:
                return false;
            }
            
            ConstantDataArray *real_name = dyn_cast<ConstantDataArray>(metadata->getOperand(0));
            MDString *real_name = dyn_cast<MDString>(metadata->getOperand(0));
            
            if (!real_name)
            {
                if (log)
                    log->Printf("Function call metadata is not a ConstantArray for [%p] %s", call_inst, PrintValue(call_inst).c_str());
                    log->Printf("Function call metadata is not an MDString for [%p] %s", call_inst, PrintValue(call_inst).c_str());
                return false;
            }

            if (!real_name->isString())
            {
                if (log)
                    log->Printf("Function call metadata is not a string for [%p] %s", call_inst, PrintValue(call_inst).c_str());
                return false;
            }
            
            std::string name_str = real_name->getAsString();
            std::string name_str = real_name->getString();
            const char* name_cstr = name_str.c_str();
            
            if (log)
+4 −6
Original line number Diff line number Diff line
@@ -337,11 +337,9 @@ IRForTarget::RegisterFunctionMetadata(LLVMContext &context,
                
        if (Instruction *user_inst = dyn_cast<Instruction>(user))
        {
            Constant *name_array = ConstantDataArray::getString(context, StringRef(name));
            MDString* md_name = MDString::get(context, StringRef(name));

            ArrayRef<Value *> md_values(name_array);
            
            MDNode *metadata = MDNode::get(context, md_values);
            MDNode *metadata = MDNode::get(context, md_name);

            user_inst->setMetadata("lldb.call.realName", metadata);
        }