diff options
Diffstat (limited to 'lib/Analysis/DebugInfo.cpp')
| -rw-r--r-- | lib/Analysis/DebugInfo.cpp | 675 | 
1 files changed, 12 insertions, 663 deletions
diff --git a/lib/Analysis/DebugInfo.cpp b/lib/Analysis/DebugInfo.cpp index 9db1456edd05d..67f8147f4d610 100644 --- a/lib/Analysis/DebugInfo.cpp +++ b/lib/Analysis/DebugInfo.cpp @@ -725,484 +725,6 @@ void DIVariable::dump() const {    print(dbgs()); dbgs() << '\n';  } -//===----------------------------------------------------------------------===// -// DIFactory: Basic Helpers -//===----------------------------------------------------------------------===// - -DIFactory::DIFactory(Module &m) -  : M(m), VMContext(M.getContext()), DeclareFn(0), ValueFn(0) {} - -Constant *DIFactory::GetTagConstant(unsigned TAG) { -  assert((TAG & LLVMDebugVersionMask) == 0 && -         "Tag too large for debug encoding!"); -  return ConstantInt::get(Type::getInt32Ty(VMContext), TAG | LLVMDebugVersion); -} - -//===----------------------------------------------------------------------===// -// DIFactory: Primary Constructors -//===----------------------------------------------------------------------===// - -/// GetOrCreateArray - Create an descriptor for an array of descriptors. -/// This implicitly uniques the arrays created. -DIArray DIFactory::GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys) { -  if (NumTys == 0) { -    Value *Null = llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)); -    return DIArray(MDNode::get(VMContext, &Null, 1)); -  } - -  SmallVector<Value *, 16> Elts(Tys, Tys+NumTys); -  return DIArray(MDNode::get(VMContext, Elts.data(), Elts.size())); -} - -/// GetOrCreateSubrange - Create a descriptor for a value range.  This -/// implicitly uniques the values returned. -DISubrange DIFactory::GetOrCreateSubrange(int64_t Lo, int64_t Hi) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_subrange_type), -    ConstantInt::get(Type::getInt64Ty(VMContext), Lo), -    ConstantInt::get(Type::getInt64Ty(VMContext), Hi) -  }; - -  return DISubrange(MDNode::get(VMContext, &Elts[0], 3)); -} - -/// CreateUnspecifiedParameter - Create unspeicified type descriptor -/// for the subroutine type. -DIDescriptor DIFactory::CreateUnspecifiedParameter() { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_unspecified_parameters) -  }; -  return DIDescriptor(MDNode::get(VMContext, &Elts[0], 1)); -} - -/// CreateCompileUnit - Create a new descriptor for the specified compile -/// unit.  Note that this does not unique compile units within the module. -DICompileUnit DIFactory::CreateCompileUnit(unsigned LangID, -                                           StringRef Filename, -                                           StringRef Directory, -                                           StringRef Producer, -                                           bool isMain, -                                           bool isOptimized, -                                           StringRef Flags, -                                           unsigned RunTimeVer) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_compile_unit), -    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)), -    ConstantInt::get(Type::getInt32Ty(VMContext), LangID), -    MDString::get(VMContext, Filename), -    MDString::get(VMContext, Directory), -    MDString::get(VMContext, Producer), -    ConstantInt::get(Type::getInt1Ty(VMContext), isMain), -    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), -    MDString::get(VMContext, Flags), -    ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer) -  }; - -  return DICompileUnit(MDNode::get(VMContext, &Elts[0], 10)); -} - -/// CreateFile -  Create a new descriptor for the specified file. -DIFile DIFactory::CreateFile(StringRef Filename, -                             StringRef Directory, -                             DICompileUnit CU) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_file_type), -    MDString::get(VMContext, Filename), -    MDString::get(VMContext, Directory), -    CU -  }; - -  return DIFile(MDNode::get(VMContext, &Elts[0], 4)); -} - -/// CreateEnumerator - Create a single enumerator value. -DIEnumerator DIFactory::CreateEnumerator(StringRef Name, uint64_t Val){ -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_enumerator), -    MDString::get(VMContext, Name), -    ConstantInt::get(Type::getInt64Ty(VMContext), Val) -  }; -  return DIEnumerator(MDNode::get(VMContext, &Elts[0], 3)); -} - - -/// CreateBasicType - Create a basic type like int, float, etc. -DIBasicType DIFactory::CreateBasicType(DIDescriptor Context, -                                       StringRef Name, -                                       DIFile F, -                                       unsigned LineNumber, -                                       uint64_t SizeInBits, -                                       uint64_t AlignInBits, -                                       uint64_t OffsetInBits, unsigned Flags, -                                       unsigned Encoding) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_base_type), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), -    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), -    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), -    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags), -    ConstantInt::get(Type::getInt32Ty(VMContext), Encoding) -  }; -  return DIBasicType(MDNode::get(VMContext, &Elts[0], 10)); -} - - -/// CreateBasicType - Create a basic type like int, float, etc. -DIBasicType DIFactory::CreateBasicTypeEx(DIDescriptor Context, -                                         StringRef Name, -                                         DIFile F, -                                         unsigned LineNumber, -                                         Constant *SizeInBits, -                                         Constant *AlignInBits, -                                         Constant *OffsetInBits, unsigned Flags, -                                         unsigned Encoding) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_base_type), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), -    SizeInBits, -    AlignInBits, -    OffsetInBits, -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags), -    ConstantInt::get(Type::getInt32Ty(VMContext), Encoding) -  }; -  return DIBasicType(MDNode::get(VMContext, &Elts[0], 10)); -} - -/// CreateArtificialType - Create a new DIType with "artificial" flag set. -DIType DIFactory::CreateArtificialType(DIType Ty) { -  if (Ty.isArtificial()) -    return Ty; - -  SmallVector<Value *, 9> Elts; -  MDNode *N = Ty; -  assert (N && "Unexpected input DIType!"); -  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { -    if (Value *V = N->getOperand(i)) -      Elts.push_back(V); -    else -      Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext))); -  } - -  unsigned CurFlags = Ty.getFlags(); -  CurFlags = CurFlags | DIType::FlagArtificial; - -  // Flags are stored at this slot. -  Elts[8] =  ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags); - -  return DIType(MDNode::get(VMContext, Elts.data(), Elts.size())); -} - -/// CreateDerivedType - Create a derived type like const qualified type, -/// pointer, typedef, etc. -DIDerivedType DIFactory::CreateDerivedType(unsigned Tag, -                                           DIDescriptor Context, -                                           StringRef Name, -                                           DIFile F, -                                           unsigned LineNumber, -                                           uint64_t SizeInBits, -                                           uint64_t AlignInBits, -                                           uint64_t OffsetInBits, -                                           unsigned Flags, -                                           DIType DerivedFrom) { -  Value *Elts[] = { -    GetTagConstant(Tag), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), -    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), -    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), -    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags), -    DerivedFrom, -  }; -  return DIDerivedType(MDNode::get(VMContext, &Elts[0], 10)); -} - - -/// CreateDerivedType - Create a derived type like const qualified type, -/// pointer, typedef, etc. -DIDerivedType DIFactory::CreateDerivedTypeEx(unsigned Tag, -                                             DIDescriptor Context, -                                             StringRef Name, -                                             DIFile F, -                                             unsigned LineNumber, -                                             Constant *SizeInBits, -                                             Constant *AlignInBits, -                                             Constant *OffsetInBits, -                                             unsigned Flags, -                                             DIType DerivedFrom) { -  Value *Elts[] = { -    GetTagConstant(Tag), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), -    SizeInBits, -    AlignInBits, -    OffsetInBits, -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags), -    DerivedFrom, -  }; -  return DIDerivedType(MDNode::get(VMContext, &Elts[0], 10)); -} - - -/// CreateCompositeType - Create a composite type like array, struct, etc. -DICompositeType DIFactory::CreateCompositeType(unsigned Tag, -                                               DIDescriptor Context, -                                               StringRef Name, -                                               DIFile F, -                                               unsigned LineNumber, -                                               uint64_t SizeInBits, -                                               uint64_t AlignInBits, -                                               uint64_t OffsetInBits, -                                               unsigned Flags, -                                               DIType DerivedFrom, -                                               DIArray Elements, -                                               unsigned RuntimeLang, -                                               MDNode *ContainingType) { - -  Value *Elts[] = { -    GetTagConstant(Tag), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), -    ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits), -    ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), -    ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits), -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags), -    DerivedFrom, -    Elements, -    ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang), -    ContainingType -  }; - -  MDNode *Node = MDNode::get(VMContext, &Elts[0], 13); -  // Create a named metadata so that we do not lose this enum info. -  if (Tag == dwarf::DW_TAG_enumeration_type) { -    NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.enum"); -    NMD->addOperand(Node); -  } -  return DICompositeType(Node); -} - -/// CreateTemporaryType - Create a temporary forward-declared type. -DIType DIFactory::CreateTemporaryType() { -  // Give the temporary MDNode a tag. It doesn't matter what tag we -  // use here as long as DIType accepts it. -  Value *Elts[] = { -    GetTagConstant(DW_TAG_base_type) -  }; -  MDNode *Node = MDNode::getTemporary(VMContext, Elts, array_lengthof(Elts)); -  return DIType(Node); -} - -/// CreateTemporaryType - Create a temporary forward-declared type. -DIType DIFactory::CreateTemporaryType(DIFile F) { -  // Give the temporary MDNode a tag. It doesn't matter what tag we -  // use here as long as DIType accepts it. -  Value *Elts[] = { -    GetTagConstant(DW_TAG_base_type), -    F.getCompileUnit(), -    NULL, -    F -  }; -  MDNode *Node = MDNode::getTemporary(VMContext, Elts, array_lengthof(Elts)); -  return DIType(Node); -} - -/// CreateCompositeType - Create a composite type like array, struct, etc. -DICompositeType DIFactory::CreateCompositeTypeEx(unsigned Tag, -                                                 DIDescriptor Context, -                                                 StringRef Name, -                                                 DIFile F, -                                                 unsigned LineNumber, -                                                 Constant *SizeInBits, -                                                 Constant *AlignInBits, -                                                 Constant *OffsetInBits, -                                                 unsigned Flags, -                                                 DIType DerivedFrom, -                                                 DIArray Elements, -                                                 unsigned RuntimeLang, -                                                 MDNode *ContainingType) { -  Value *Elts[] = { -    GetTagConstant(Tag), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber), -    SizeInBits, -    AlignInBits, -    OffsetInBits, -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags), -    DerivedFrom, -    Elements, -    ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang), -    ContainingType -  }; -  MDNode *Node = MDNode::get(VMContext, &Elts[0], 13); -  // Create a named metadata so that we do not lose this enum info. -  if (Tag == dwarf::DW_TAG_enumeration_type) { -    NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.enum"); -    NMD->addOperand(Node); -  } -  return DICompositeType(Node); -} - - -/// CreateSubprogram - Create a new descriptor for the specified subprogram. -/// See comments in DISubprogram for descriptions of these fields.  This -/// method does not unique the generated descriptors. -DISubprogram DIFactory::CreateSubprogram(DIDescriptor Context, -                                         StringRef Name, -                                         StringRef DisplayName, -                                         StringRef LinkageName, -                                         DIFile F, -                                         unsigned LineNo, DIType Ty, -                                         bool isLocalToUnit, -                                         bool isDefinition, -                                         unsigned VK, unsigned VIndex, -                                         DIType ContainingType, -                                         unsigned Flags, -                                         bool isOptimized, -                                         Function *Fn) { - -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_subprogram), -    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)), -    Context, -    MDString::get(VMContext, Name), -    MDString::get(VMContext, DisplayName), -    MDString::get(VMContext, LinkageName), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    Ty, -    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), -    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), -    ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK), -    ConstantInt::get(Type::getInt32Ty(VMContext), VIndex), -    ContainingType, -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags), -    ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), -    Fn -  }; -  MDNode *Node = MDNode::get(VMContext, &Elts[0], 17); - -  // Create a named metadata so that we do not lose this mdnode. -  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp"); -  NMD->addOperand(Node); -  return DISubprogram(Node); -} - -/// CreateSubprogramDefinition - Create new subprogram descriptor for the -/// given declaration. -DISubprogram DIFactory::CreateSubprogramDefinition(DISubprogram &SPDeclaration){ -  if (SPDeclaration.isDefinition()) -    return DISubprogram(SPDeclaration); - -  MDNode *DeclNode = SPDeclaration; -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_subprogram), -    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)), -    DeclNode->getOperand(2), // Context -    DeclNode->getOperand(3), // Name -    DeclNode->getOperand(4), // DisplayName -    DeclNode->getOperand(5), // LinkageName -    DeclNode->getOperand(6), // CompileUnit -    DeclNode->getOperand(7), // LineNo -    DeclNode->getOperand(8), // Type -    DeclNode->getOperand(9), // isLocalToUnit -    ConstantInt::get(Type::getInt1Ty(VMContext), true), -    DeclNode->getOperand(11), // Virtuality -    DeclNode->getOperand(12), // VIndex -    DeclNode->getOperand(13), // Containting Type -    DeclNode->getOperand(14), // Flags -    DeclNode->getOperand(15), // isOptimized -    SPDeclaration.getFunction() -  }; -  MDNode *Node =MDNode::get(VMContext, &Elts[0], 16); - -  // Create a named metadata so that we do not lose this mdnode. -  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp"); -  NMD->addOperand(Node); -  return DISubprogram(Node); -} - -/// CreateGlobalVariable - Create a new descriptor for the specified global. -DIGlobalVariable -DIFactory::CreateGlobalVariable(DIDescriptor Context, StringRef Name, -                                StringRef DisplayName, -                                StringRef LinkageName, -                                DIFile F, -                                unsigned LineNo, DIType Ty,bool isLocalToUnit, -                                bool isDefinition, llvm::GlobalVariable *Val) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_variable), -    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)), -    Context, -    MDString::get(VMContext, Name), -    MDString::get(VMContext, DisplayName), -    MDString::get(VMContext, LinkageName), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    Ty, -    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), -    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), -    Val -  }; - -  Value *const *Vs = &Elts[0]; -  MDNode *Node = MDNode::get(VMContext,Vs, 12); - -  // Create a named metadata so that we do not lose this mdnode. -  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv"); -  NMD->addOperand(Node); - -  return DIGlobalVariable(Node); -} - -/// CreateGlobalVariable - Create a new descriptor for the specified constant. -DIGlobalVariable -DIFactory::CreateGlobalVariable(DIDescriptor Context, StringRef Name, -                                StringRef DisplayName, -                                StringRef LinkageName, -                                DIFile F, -                                unsigned LineNo, DIType Ty,bool isLocalToUnit, -                                bool isDefinition, llvm::Constant *Val) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_variable), -    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)), -    Context, -    MDString::get(VMContext, Name), -    MDString::get(VMContext, DisplayName), -    MDString::get(VMContext, LinkageName), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    Ty, -    ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit), -    ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), -    Val -  }; - -  Value *const *Vs = &Elts[0]; -  MDNode *Node = MDNode::get(VMContext,Vs, 12); - -  // Create a named metadata so that we do not lose this mdnode. -  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv"); -  NMD->addOperand(Node); - -  return DIGlobalVariable(Node); -} -  /// fixupObjcLikeName - Replace contains special characters used  /// in a typical Objective-C names with '.' in a given string.  static void fixupObjcLikeName(std::string &Str) { @@ -1214,19 +736,6 @@ static void fixupObjcLikeName(std::string &Str) {    }  } -/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable -/// to hold function specific information. -NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) { -  SmallString<32> Out; -  if (FuncName.find('[') == StringRef::npos) -    return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FuncName) -                                      .toStringRef(Out));  -  std::string Name = FuncName; -  fixupObjcLikeName(Name); -  return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", Name) -                                    .toStringRef(Out)); -} -  /// getFnSpecificMDNode - Return a NameMDNode, if available, that is   /// suitable to hold function specific information.  NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) { @@ -1237,178 +746,18 @@ NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) {    return M.getNamedMetadata(Twine("llvm.dbg.lv.", Name));  } -/// CreateVariable - Create a new descriptor for the specified variable. -DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context, -                                     StringRef Name, -                                     DIFile F, -                                     unsigned LineNo, -                                     DIType Ty, bool AlwaysPreserve, -                                     unsigned Flags) { -  Value *Elts[] = { -    GetTagConstant(Tag), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    Ty, -    ConstantInt::get(Type::getInt32Ty(VMContext), Flags) -  }; -  MDNode *Node = MDNode::get(VMContext, &Elts[0], 7); -  if (AlwaysPreserve) { -    // The optimizer may remove local variable. If there is an interest -    // to preserve variable info in such situation then stash it in a -    // named mdnode. -    DISubprogram Fn(getDISubprogram(Context)); -    StringRef FName = "fn"; -    if (Fn.getFunction()) -      FName = Fn.getFunction()->getName(); -    char One = '\1'; -    if (FName.startswith(StringRef(&One, 1))) -      FName = FName.substr(1); - - -    NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, FName); -    FnLocals->addOperand(Node); -  } -  return DIVariable(Node); -} - - -/// CreateComplexVariable - Create a new descriptor for the specified variable -/// which has a complex address expression for its address. -DIVariable DIFactory::CreateComplexVariable(unsigned Tag, DIDescriptor Context, -                                            StringRef Name, DIFile F, -                                            unsigned LineNo, -                                            DIType Ty, Value *const *Addr, -                                            unsigned NumAddr) { -  SmallVector<Value *, 15> Elts; -  Elts.push_back(GetTagConstant(Tag)); -  Elts.push_back(Context); -  Elts.push_back(MDString::get(VMContext, Name)); -  Elts.push_back(F); -  Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)); -  Elts.push_back(Ty); -  Elts.append(Addr, Addr+NumAddr); - -  return DIVariable(MDNode::get(VMContext, Elts.data(), Elts.size())); -} - - -/// CreateBlock - This creates a descriptor for a lexical block with the -/// specified parent VMContext. -DILexicalBlock DIFactory::CreateLexicalBlock(DIDescriptor Context, -                                             DIFile F, unsigned LineNo, -                                             unsigned Col) { -  // Defeat MDNode uniqing for lexical blocks. -  static unsigned int unique_id = 0; -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_lexical_block), -    Context, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    ConstantInt::get(Type::getInt32Ty(VMContext), Col), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++) -  }; -  return DILexicalBlock(MDNode::get(VMContext, &Elts[0], 6)); -} - -/// CreateNameSpace - This creates new descriptor for a namespace -/// with the specified parent context. -DINameSpace DIFactory::CreateNameSpace(DIDescriptor Context, StringRef Name, -                                       DIFile F, -                                       unsigned LineNo) { -  Value *Elts[] = { -    GetTagConstant(dwarf::DW_TAG_namespace), -    Context, -    MDString::get(VMContext, Name), -    F, -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo) -  }; -  return DINameSpace(MDNode::get(VMContext, &Elts[0], 5)); -} - -/// CreateLocation - Creates a debug info location. -DILocation DIFactory::CreateLocation(unsigned LineNo, unsigned ColumnNo, -                                     DIScope S, DILocation OrigLoc) { -  Value *Elts[] = { -    ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo), -    S, -    OrigLoc, -  }; -  return DILocation(MDNode::get(VMContext, &Elts[0], 4)); -} - -//===----------------------------------------------------------------------===// -// DIFactory: Routines for inserting code into a function -//===----------------------------------------------------------------------===// - -/// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call. -Instruction *DIFactory::InsertDeclare(Value *Storage, DIVariable D, -                                      Instruction *InsertBefore) { -  assert(Storage && "no storage passed to dbg.declare"); -  assert(D.Verify() && "empty DIVariable passed to dbg.declare"); -  if (!DeclareFn) -    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); - -  Value *Args[] = { MDNode::get(Storage->getContext(), &Storage, 1), -                    D }; -  return CallInst::Create(DeclareFn, Args, Args+2, "", InsertBefore); -} - -/// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call. -Instruction *DIFactory::InsertDeclare(Value *Storage, DIVariable D, -                                      BasicBlock *InsertAtEnd) { -  assert(Storage && "no storage passed to dbg.declare"); -  assert(D.Verify() && "invalid DIVariable passed to dbg.declare"); -  if (!DeclareFn) -    DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); - -  Value *Args[] = { MDNode::get(Storage->getContext(), &Storage, 1), -                    D }; - -  // If this block already has a terminator then insert this intrinsic -  // before the terminator. -  if (TerminatorInst *T = InsertAtEnd->getTerminator()) -    return CallInst::Create(DeclareFn, Args, Args+2, "", T); -  else -    return CallInst::Create(DeclareFn, Args, Args+2, "", InsertAtEnd);} - -/// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. -Instruction *DIFactory::InsertDbgValueIntrinsic(Value *V, uint64_t Offset, -                                                DIVariable D, -                                                Instruction *InsertBefore) { -  assert(V && "no value passed to dbg.value"); -  assert(D.Verify() && "invalid DIVariable passed to dbg.value"); -  if (!ValueFn) -    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); - -  Value *Args[] = { MDNode::get(V->getContext(), &V, 1), -                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), -                    D }; -  return CallInst::Create(ValueFn, Args, Args+3, "", InsertBefore); -} - -/// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call. -Instruction *DIFactory::InsertDbgValueIntrinsic(Value *V, uint64_t Offset, -                                                DIVariable D, -                                                BasicBlock *InsertAtEnd) { -  assert(V && "no value passed to dbg.value"); -  assert(D.Verify() && "invalid DIVariable passed to dbg.value"); -  if (!ValueFn) -    ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); - -  Value *Args[] = { MDNode::get(V->getContext(), &V, 1), -                    ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset), -                    D }; -  return CallInst::Create(ValueFn, Args, Args+3, "", InsertAtEnd); -} - -// RecordType - Record DIType in a module such that it is not lost even if -// it is not referenced through debug info anchors. -void DIFactory::RecordType(DIType T) { -  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.ty"); -  NMD->addOperand(T); +/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable +/// to hold function specific information. +NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) { +  SmallString<32> Out; +  if (FuncName.find('[') == StringRef::npos) +    return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FuncName) +                                      .toStringRef(Out)); +   +  std::string Name = FuncName; +  fixupObjcLikeName(Name); +  return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", Name) +                                    .toStringRef(Out));  }  | 
