diff options
Diffstat (limited to 'llvm/lib')
20 files changed, 415 insertions, 610 deletions
diff --git a/llvm/lib/Analysis/DbgInfoPrinter.cpp b/llvm/lib/Analysis/DbgInfoPrinter.cpp index 913490d604a..8063476bb5e 100644 --- a/llvm/lib/Analysis/DbgInfoPrinter.cpp +++ b/llvm/lib/Analysis/DbgInfoPrinter.cpp @@ -90,7 +90,7 @@ void PrintDbgInfo::printStopPoint(const DbgStopPointInst *DSI) {  }  void PrintDbgInfo::printFuncStart(const DbgFuncStartInst *FS) { -  DISubprogram Subprogram(cast<GlobalVariable>(FS->getSubprogram())); +  DISubprogram Subprogram(FS->getSubprogram());    std::string Res1, Res2;    Out << "; fully qualified function name: " << Subprogram.getDisplayName(Res1)        << " return type: " << Subprogram.getReturnTypeName(Res2) diff --git a/llvm/lib/Analysis/DebugInfo.cpp b/llvm/lib/Analysis/DebugInfo.cpp index b7c73f87608..0d4b213e806 100644 --- a/llvm/lib/Analysis/DebugInfo.cpp +++ b/llvm/lib/Analysis/DebugInfo.cpp @@ -21,6 +21,7 @@  #include "llvm/LLVMContext.h"  #include "llvm/Module.h"  #include "llvm/Analysis/ValueTracking.h" +#include "llvm/ADT/SmallPtrSet.h"  #include "llvm/Support/Dwarf.h"  #include "llvm/Support/DebugLoc.h"  #include "llvm/Support/raw_ostream.h" @@ -32,18 +33,12 @@ using namespace llvm::dwarf;  //===----------------------------------------------------------------------===//  /// ValidDebugInfo - Return true if V represents valid debug info value. -bool DIDescriptor::ValidDebugInfo(Value *V, CodeGenOpt::Level OptLevel) { -  if (!V) +/// FIXME : Add DIDescriptor.isValid() +bool DIDescriptor::ValidDebugInfo(MDNode *N, CodeGenOpt::Level OptLevel) { +  if (!N)      return false; -  GlobalVariable *GV = dyn_cast<GlobalVariable>(V->stripPointerCasts()); -  if (!GV) -    return false; - -  if (!GV->hasInternalLinkage () && !GV->hasLinkOnceLinkage()) -    return false; - -  DIDescriptor DI(GV); +  DIDescriptor DI(N);    // Check current version. Allow Version6 for now.    unsigned Version = DI.getVersion(); @@ -53,13 +48,13 @@ bool DIDescriptor::ValidDebugInfo(Value *V, CodeGenOpt::Level OptLevel) {    unsigned Tag = DI.getTag();    switch (Tag) {    case DW_TAG_variable: -    assert(DIVariable(GV).Verify() && "Invalid DebugInfo value"); +    assert(DIVariable(N).Verify() && "Invalid DebugInfo value");      break;    case DW_TAG_compile_unit: -    assert(DICompileUnit(GV).Verify() && "Invalid DebugInfo value"); +    assert(DICompileUnit(N).Verify() && "Invalid DebugInfo value");      break;    case DW_TAG_subprogram: -    assert(DISubprogram(GV).Verify() && "Invalid DebugInfo value"); +    assert(DISubprogram(N).Verify() && "Invalid DebugInfo value");      break;    case DW_TAG_lexical_block:      // FIXME: This interfers with the quality of generated code during @@ -74,67 +69,58 @@ bool DIDescriptor::ValidDebugInfo(Value *V, CodeGenOpt::Level OptLevel) {    return true;  } -DIDescriptor::DIDescriptor(GlobalVariable *GV, unsigned RequiredTag) { -  DbgGV = GV; +DIDescriptor::DIDescriptor(MDNode *N, unsigned RequiredTag) { +  DbgNode = N;    // If this is non-null, check to see if the Tag matches. If not, set to null. -  if (GV && getTag() != RequiredTag) -    DbgGV = 0; +  if (N && getTag() != RequiredTag) { +    DbgNode = 0; +  }  }  const std::string &  DIDescriptor::getStringField(unsigned Elt, std::string &Result) const { -  if (DbgGV == 0) { -    Result.clear(); +  Result.clear(); +  if (DbgNode == 0)      return Result; -  } - -  Constant *C = DbgGV->getInitializer(); -  if (C == 0 || Elt >= C->getNumOperands()) { -    Result.clear(); -    return Result; -  } - -  // Fills in the string if it succeeds -  if (!GetConstantStringInfo(C->getOperand(Elt), Result)) -    Result.clear(); +  if (Elt < DbgNode->getNumElements())  +    if (MDString *MDS = dyn_cast_or_null<MDString>(DbgNode->getElement(Elt))) { +      Result.assign(MDS->begin(), MDS->begin() + MDS->length()); +      return Result; +    } +      return Result;  }  uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const { -  if (DbgGV == 0) return 0; -  if (!DbgGV->hasInitializer()) return 0; - -  Constant *C = DbgGV->getInitializer(); -  if (C == 0 || Elt >= C->getNumOperands()) +  if (DbgNode == 0)       return 0; -  if (ConstantInt *CI = dyn_cast<ConstantInt>(C->getOperand(Elt))) -    return CI->getZExtValue(); +  if (Elt < DbgNode->getNumElements()) +    if (ConstantInt *CI = dyn_cast<ConstantInt>(DbgNode->getElement(Elt))) +      return CI->getZExtValue(); +      return 0;  }  DIDescriptor DIDescriptor::getDescriptorField(unsigned Elt) const { -  if (DbgGV == 0) return DIDescriptor(); - -  Constant *C = DbgGV->getInitializer(); -  if (C == 0 || Elt >= C->getNumOperands()) +  if (DbgNode == 0)       return DIDescriptor(); -  C = C->getOperand(Elt); -  return DIDescriptor(dyn_cast<GlobalVariable>(C->stripPointerCasts())); +  if (Elt < DbgNode->getNumElements() && DbgNode->getElement(Elt)) +    return DIDescriptor(dyn_cast<MDNode>(DbgNode->getElement(Elt))); + +  return DIDescriptor();  }  GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const { -  if (DbgGV == 0) return 0; - -  Constant *C = DbgGV->getInitializer(); -  if (C == 0 || Elt >= C->getNumOperands()) +  if (DbgNode == 0)       return 0; -  C = C->getOperand(Elt); -  return dyn_cast<GlobalVariable>(C->stripPointerCasts()); +  if (Elt < DbgNode->getNumElements()) +      return dyn_cast<GlobalVariable>(DbgNode->getElement(Elt)); +  return 0;  }  //===----------------------------------------------------------------------===// @@ -142,12 +128,13 @@ GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {  //===----------------------------------------------------------------------===//  // Needed by DIVariable::getType(). -DIType::DIType(GlobalVariable *GV) : DIDescriptor(GV) { -  if (!GV) return; +DIType::DIType(MDNode *N) : DIDescriptor(N) { +  if (!N) return;    unsigned tag = getTag();    if (tag != dwarf::DW_TAG_base_type && !DIDerivedType::isDerivedType(tag) && -      !DICompositeType::isCompositeType(tag)) -    DbgGV = 0; +      !DICompositeType::isCompositeType(tag)) { +    DbgNode = 0; +  }  }  /// isDerivedType - Return true if the specified tag is legal for @@ -164,9 +151,8 @@ bool DIType::isDerivedType(unsigned Tag) {    case dwarf::DW_TAG_inheritance:      return true;    default: -    // FIXME: Even though it doesn't make sense, CompositeTypes are current -    // modelled as DerivedTypes, this should return true for them as well. -    return false; +    // CompositeTypes are currently modelled as DerivedTypes. +    return isCompositeType(Tag);    }  } @@ -200,10 +186,8 @@ bool DIVariable::isVariable(unsigned Tag) {  }  unsigned DIArray::getNumElements() const { -  assert (DbgGV && "Invalid DIArray"); -  Constant *C = DbgGV->getInitializer(); -  assert (C && "Invalid DIArray initializer"); -  return C->getNumOperands(); +  assert (DbgNode && "Invalid DIArray"); +  return DbgNode->getNumElements();  }  /// replaceAllUsesWith - Replace all uses of debug info referenced by @@ -214,8 +198,8 @@ void DIDerivedType::replaceAllUsesWith(DIDescriptor &D) {      return;    assert (!D.isNull() && "Can not replace with null"); -  getGV()->replaceAllUsesWith(D.getGV()); -  getGV()->eraseFromParent(); +  DbgNode->replaceAllUsesWith(D.getNode()); +  delete DbgNode;  }  /// Verify - Verify that a compile unit is well formed. @@ -341,8 +325,8 @@ bool DISubprogram::describes(const Function *F) {  /// dump - Print descriptor.  void DIDescriptor::dump() const { -  errs() << "[" << dwarf::TagString(getTag()) << "] [GV:"; -  errs().write_hex((intptr_t)DbgGV) << ']'; +  errs() << "[" << dwarf::TagString(getTag()) << "] "; +  errs().write_hex((intptr_t)DbgNode) << ']';  }  /// dump - Print compile unit. @@ -383,11 +367,11 @@ void DIType::dump() const {      errs() << " [fwd] ";    if (isBasicType(Tag)) -    DIBasicType(DbgGV).dump(); +    DIBasicType(DbgNode).dump();    else if (isDerivedType(Tag)) -    DIDerivedType(DbgGV).dump(); +    DIDerivedType(DbgNode).dump();    else if (isCompositeType(Tag)) -    DICompositeType(DbgGV).dump(); +    DICompositeType(DbgNode).dump();    else {      errs() << "Invalid DIType\n";      return; @@ -434,7 +418,7 @@ void DIGlobal::dump() const {      errs() << " [def] ";    if (isGlobalVariable(Tag)) -    DIGlobalVariable(DbgGV).dump(); +    DIGlobalVariable(DbgNode).dump();    errs() << "\n";  } @@ -474,43 +458,12 @@ DIFactory::DIFactory(Module &m)    EmptyStructPtr = PointerType::getUnqual(StructType::get(VMContext));  } -/// getCastToEmpty - Return this descriptor as a Constant* with type '{}*'. -/// This is only valid when the descriptor is non-null. -Constant *DIFactory::getCastToEmpty(DIDescriptor D) { -  if (D.isNull()) return llvm::Constant::getNullValue(EmptyStructPtr); -  return ConstantExpr::getBitCast(D.getGV(), EmptyStructPtr); -} -  Constant *DIFactory::GetTagConstant(unsigned TAG) {    assert((TAG & LLVMDebugVersionMask) == 0 &&           "Tag too large for debug encoding!");    return ConstantInt::get(Type::getInt32Ty(VMContext), TAG | LLVMDebugVersion);  } -Constant *DIFactory::GetStringConstant(const std::string &String) { -  // Check string cache for previous edition. -  Constant *&Slot = StringCache[String]; -   -  // Return Constant if previously defined. -  if (Slot) return Slot; -   -  const PointerType *DestTy = PointerType::getUnqual(Type::getInt8Ty(VMContext)); -   -  // If empty string then use a i8* null instead. -  if (String.empty()) -    return Slot = ConstantPointerNull::get(DestTy); - -  // Construct string as an llvm constant. -  Constant *ConstStr = ConstantArray::get(VMContext, String); -     -  // Otherwise create and return a new string global. -  GlobalVariable *StrGV = new GlobalVariable(M, ConstStr->getType(), true, -                                             GlobalVariable::InternalLinkage, -                                             ConstStr, ".str"); -  StrGV->setSection("llvm.metadata"); -  return Slot = ConstantExpr::getBitCast(StrGV, DestTy); -} -  //===----------------------------------------------------------------------===//  // DIFactory: Primary Constructors  //===----------------------------------------------------------------------===// @@ -518,50 +471,27 @@ Constant *DIFactory::GetStringConstant(const std::string &String) {  /// GetOrCreateArray - Create an descriptor for an array of descriptors.   /// This implicitly uniques the arrays created.  DIArray DIFactory::GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys) { -  SmallVector<Constant*, 16> Elts; -   -  for (unsigned i = 0; i != NumTys; ++i) -    Elts.push_back(getCastToEmpty(Tys[i])); +  SmallVector<Value*, 16> Elts; -  Constant *Init = ConstantArray::get(ArrayType::get(EmptyStructPtr, -                                                     Elts.size()), -                                      Elts.data(), Elts.size()); -  // If we already have this array, just return the uniqued version. -  DIDescriptor &Entry = SimpleConstantCache[Init]; -  if (!Entry.isNull()) return DIArray(Entry.getGV()); - -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.array"); -  GV->setSection("llvm.metadata"); -  Entry = DIDescriptor(GV); -  return DIArray(GV); +  if (NumTys == 0) +    Elts.push_back(llvm::Constant::getNullValue(Type::getInt32Ty(VMContext))); +  else +    for (unsigned i = 0; i != NumTys; ++i) +      Elts.push_back(Tys[i].getNode()); + +  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) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(dwarf::DW_TAG_subrange_type),      ConstantInt::get(Type::getInt64Ty(VMContext), Lo),      ConstantInt::get(Type::getInt64Ty(VMContext), Hi)    }; -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); - -  // If we already have this range, just return the uniqued version. -  DIDescriptor &Entry = SimpleConstantCache[Init]; -  if (!Entry.isNull()) return DISubrange(Entry.getGV()); -   -  M.addTypeName("llvm.dbg.subrange.type", Init->getType()); - -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.subrange"); -  GV->setSection("llvm.metadata"); -  Entry = DIDescriptor(GV); -  return DISubrange(GV); +  return DISubrange(MDNode::get(VMContext, &Elts[0], 3));  } @@ -576,47 +506,30 @@ DICompileUnit DIFactory::CreateCompileUnit(unsigned LangID,                                             bool isOptimized,                                             const char *Flags,                                             unsigned RunTimeVer) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(dwarf::DW_TAG_compile_unit), -    llvm::Constant::getNullValue(EmptyStructPtr), +    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),      ConstantInt::get(Type::getInt32Ty(VMContext), LangID), -    GetStringConstant(Filename), -    GetStringConstant(Directory), -    GetStringConstant(Producer), +    MDString::get(VMContext, Filename), +    MDString::get(VMContext, Directory), +    MDString::get(VMContext, Producer),      ConstantInt::get(Type::getInt1Ty(VMContext), isMain),      ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized), -    GetStringConstant(Flags), +    MDString::get(VMContext, Flags),      ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer)    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.compile_unit.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.compile_unit"); -  GV->setSection("llvm.metadata"); -  return DICompileUnit(GV); + +  return DICompileUnit(MDNode::get(VMContext, &Elts[0], 10));  }  /// CreateEnumerator - Create a single enumerator value.  DIEnumerator DIFactory::CreateEnumerator(const std::string &Name, uint64_t Val){ -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(dwarf::DW_TAG_enumerator), -    GetStringConstant(Name), +    MDString::get(VMContext, Name),      ConstantInt::get(Type::getInt64Ty(VMContext), Val)    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.enumerator.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.enumerator"); -  GV->setSection("llvm.metadata"); -  return DIEnumerator(GV); +  return DIEnumerator(MDNode::get(VMContext, &Elts[0], 3));  } @@ -629,11 +542,11 @@ DIBasicType DIFactory::CreateBasicType(DIDescriptor Context,                                         uint64_t AlignInBits,                                         uint64_t OffsetInBits, unsigned Flags,                                         unsigned Encoding) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(dwarf::DW_TAG_base_type), -    getCastToEmpty(Context), -    GetStringConstant(Name), -    getCastToEmpty(CompileUnit), +    Context.getNode(), +    MDString::get(VMContext, Name), +    CompileUnit.getNode(),      ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),      ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),      ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits), @@ -641,16 +554,7 @@ DIBasicType DIFactory::CreateBasicType(DIDescriptor Context,      ConstantInt::get(Type::getInt32Ty(VMContext), Flags),      ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.basictype.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.basictype"); -  GV->setSection("llvm.metadata"); -  return DIBasicType(GV); +  return DIBasicType(MDNode::get(VMContext, &Elts[0], 10));  }  /// CreateDerivedType - Create a derived type like const qualified type, @@ -665,28 +569,19 @@ DIDerivedType DIFactory::CreateDerivedType(unsigned Tag,                                             uint64_t OffsetInBits,                                             unsigned Flags,                                             DIType DerivedFrom) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(Tag), -    getCastToEmpty(Context), -    GetStringConstant(Name), -    getCastToEmpty(CompileUnit), +    Context.getNode(), +    MDString::get(VMContext, Name), +    CompileUnit.getNode(),      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), -    getCastToEmpty(DerivedFrom) +    DerivedFrom.getNode(),    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.derivedtype.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.derivedtype"); -  GV->setSection("llvm.metadata"); -  return DIDerivedType(GV); +  return DIDerivedType(MDNode::get(VMContext, &Elts[0], 10));  }  /// CreateCompositeType - Create a composite type like array, struct, etc. @@ -703,30 +598,21 @@ DICompositeType DIFactory::CreateCompositeType(unsigned Tag,                                                 DIArray Elements,                                                 unsigned RuntimeLang) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(Tag), -    getCastToEmpty(Context), -    GetStringConstant(Name), -    getCastToEmpty(CompileUnit), +    Context.getNode(), +    MDString::get(VMContext, Name), +    CompileUnit.getNode(),      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), -    getCastToEmpty(DerivedFrom), -    getCastToEmpty(Elements), +    DerivedFrom.getNode(), +    Elements.getNode(),      ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang)    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.composite.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.composite"); -  GV->setSection("llvm.metadata"); -  return DICompositeType(GV); +  return DICompositeType(MDNode::get(VMContext, &Elts[0], 12));  } @@ -742,29 +628,20 @@ DISubprogram DIFactory::CreateSubprogram(DIDescriptor Context,                                           bool isLocalToUnit,                                           bool isDefinition) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(dwarf::DW_TAG_subprogram), -    llvm::Constant::getNullValue(EmptyStructPtr), -    getCastToEmpty(Context), -    GetStringConstant(Name), -    GetStringConstant(DisplayName), -    GetStringConstant(LinkageName), -    getCastToEmpty(CompileUnit), +    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)), +    Context.getNode(), +    MDString::get(VMContext, Name), +    MDString::get(VMContext, DisplayName), +    MDString::get(VMContext, LinkageName), +    CompileUnit.getNode(),      ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    getCastToEmpty(Type), +    Type.getNode(),      ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),      ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition)    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.subprogram.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.subprogram"); -  GV->setSection("llvm.metadata"); -  return DISubprogram(GV); +  return DISubprogram(MDNode::get(VMContext, &Elts[0], 11));  }  /// CreateGlobalVariable - Create a new descriptor for the specified global. @@ -775,30 +652,29 @@ DIFactory::CreateGlobalVariable(DIDescriptor Context, const std::string &Name,                                  DICompileUnit CompileUnit,                                  unsigned LineNo, DIType Type,bool isLocalToUnit,                                  bool isDefinition, llvm::GlobalVariable *Val) { -  Constant *Elts[] = { +  Value *Elts[] = {       GetTagConstant(dwarf::DW_TAG_variable), -    llvm::Constant::getNullValue(EmptyStructPtr), -    getCastToEmpty(Context), -    GetStringConstant(Name), -    GetStringConstant(DisplayName), -    GetStringConstant(LinkageName), -    getCastToEmpty(CompileUnit), +    llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)), +    Context.getNode(), +    MDString::get(VMContext, Name), +    MDString::get(VMContext, DisplayName), +    MDString::get(VMContext, LinkageName), +    CompileUnit.getNode(),      ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    getCastToEmpty(Type), +    Type.getNode(),      ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),      ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition), -    ConstantExpr::getBitCast(Val, EmptyStructPtr) +    Val    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.global_variable.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::LinkOnceAnyLinkage, -                                          Init, "llvm.dbg.global_variable"); -  GV->setSection("llvm.metadata"); -  return DIGlobalVariable(GV); + +  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->addElement(Node); + +  return DIGlobalVariable(Node);  } @@ -807,44 +683,26 @@ DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,                                       const std::string &Name,                                       DICompileUnit CompileUnit, unsigned LineNo,                                       DIType Type) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(Tag), -    getCastToEmpty(Context), -    GetStringConstant(Name), -    getCastToEmpty(CompileUnit), +    Context.getNode(), +    MDString::get(VMContext, Name), +    CompileUnit.getNode(),      ConstantInt::get(Type::getInt32Ty(VMContext), LineNo), -    getCastToEmpty(Type) +    Type.getNode(),    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.variable.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.variable"); -  GV->setSection("llvm.metadata"); -  return DIVariable(GV); +  return DIVariable(MDNode::get(VMContext, &Elts[0], 6));  }  /// CreateBlock - This creates a descriptor for a lexical block with the  /// specified parent VMContext.  DIBlock DIFactory::CreateBlock(DIDescriptor Context) { -  Constant *Elts[] = { +  Value *Elts[] = {      GetTagConstant(dwarf::DW_TAG_lexical_block), -    getCastToEmpty(Context) +    Context.getNode()    }; -   -  Constant *Init = ConstantStruct::get(VMContext, Elts, -                                       sizeof(Elts)/sizeof(Elts[0])); -   -  M.addTypeName("llvm.dbg.block.type", Init->getType()); -  GlobalVariable *GV = new GlobalVariable(M, Init->getType(), true, -                                          GlobalValue::InternalLinkage, -                                          Init, "llvm.dbg.block"); -  GV->setSection("llvm.metadata"); -  return DIBlock(GV); +  return DIBlock(MDNode::get(VMContext, &Elts[0], 2));  } @@ -866,7 +724,7 @@ void DIFactory::InsertStopPoint(DICompileUnit CU, unsigned LineNo,    Value *Args[] = {      ConstantInt::get(llvm::Type::getInt32Ty(VMContext), LineNo),      ConstantInt::get(llvm::Type::getInt32Ty(VMContext), ColNo), -    getCastToEmpty(CU) +    CU.getNode()    };    CallInst::Create(StopPointFn, Args, Args+3, "", BB);  } @@ -879,7 +737,7 @@ void DIFactory::InsertSubprogramStart(DISubprogram SP, BasicBlock *BB) {      FuncStartFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_func_start);    // Call llvm.dbg.func.start which also implicitly sets a stoppoint. -  CallInst::Create(FuncStartFn, getCastToEmpty(SP), "", BB); +  CallInst::Create(FuncStartFn, SP.getNode(), "", BB);  }  /// InsertRegionStart - Insert a new llvm.dbg.region.start intrinsic call to @@ -890,7 +748,7 @@ void DIFactory::InsertRegionStart(DIDescriptor D, BasicBlock *BB) {      RegionStartFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_region_start);    // Call llvm.dbg.func.start. -  CallInst::Create(RegionStartFn, getCastToEmpty(D), "", BB); +  CallInst::Create(RegionStartFn, D.getNode(), "", BB);  }  /// InsertRegionEnd - Insert a new llvm.dbg.region.end intrinsic call to @@ -901,7 +759,7 @@ void DIFactory::InsertRegionEnd(DIDescriptor D, BasicBlock *BB) {      RegionEndFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_region_end);    // Call llvm.dbg.region.end. -  CallInst::Create(RegionEndFn, getCastToEmpty(D), "", BB); +  CallInst::Create(RegionEndFn, D.getNode(), "", BB);  }  /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call. @@ -912,17 +770,19 @@ void DIFactory::InsertDeclare(Value *Storage, DIVariable D, BasicBlock *BB) {    if (!DeclareFn)      DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); -  Value *Args[] = { Storage, getCastToEmpty(D) }; +  Value *Args[] = { Storage, D.getNode() };    CallInst::Create(DeclareFn, Args, Args+2, "", BB);  } +  //===----------------------------------------------------------------------===//  // DebugInfoFinder implementations.  //===----------------------------------------------------------------------===//  /// processModule - Process entire module and collect debug info.  void DebugInfoFinder::processModule(Module &M) { -   + +    for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)      for (Function::iterator FI = (*I).begin(), FE = (*I).end(); FI != FE; ++FI)        for (BasicBlock::iterator BI = (*FI).begin(), BE = (*FI).end(); BI != BE; @@ -938,15 +798,13 @@ void DebugInfoFinder::processModule(Module &M) {          else if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))            processDeclare(DDI);        } -   -  for (Module::global_iterator GVI = M.global_begin(), GVE = M.global_end(); -       GVI != GVE; ++GVI) { -    GlobalVariable *GV = GVI; -    if (!GV->hasName() || !GV->isConstant()  -        || strncmp(GV->getName().data(), "llvm.dbg.global_variable", 24) -        || !GV->hasInitializer()) -      continue; -    DIGlobalVariable DIG(GV); + +  NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv"); +  if (!NMD) +    return; + +  for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) { +    DIGlobalVariable DIG(cast<MDNode>(NMD->getElement(i)));      if (addGlobalVariable(DIG)) {        addCompileUnit(DIG.getCompileUnit());        processType(DIG.getType()); @@ -961,20 +819,20 @@ void DebugInfoFinder::processType(DIType DT) {    addCompileUnit(DT.getCompileUnit());    if (DT.isCompositeType(DT.getTag())) { -    DICompositeType DCT(DT.getGV()); +    DICompositeType DCT(DT.getNode());      processType(DCT.getTypeDerivedFrom());      DIArray DA = DCT.getTypeArray();      if (!DA.isNull())        for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) {          DIDescriptor D = DA.getElement(i); -        DIType TypeE = DIType(D.getGV()); +        DIType TypeE = DIType(D.getNode());          if (!TypeE.isNull())            processType(TypeE);          else  -          processSubprogram(DISubprogram(D.getGV())); +          processSubprogram(DISubprogram(D.getNode()));        }    } else if (DT.isDerivedType(DT.getTag())) { -    DIDerivedType DDT(DT.getGV()); +    DIDerivedType DDT(DT.getNode());      if (!DDT.isNull())         processType(DDT.getTypeDerivedFrom());    } @@ -992,35 +850,35 @@ void DebugInfoFinder::processSubprogram(DISubprogram SP) {  /// processStopPoint - Process DbgStopPointInst.  void DebugInfoFinder::processStopPoint(DbgStopPointInst *SPI) { -  GlobalVariable *Context = dyn_cast<GlobalVariable>(SPI->getContext()); +  MDNode *Context = dyn_cast<MDNode>(SPI->getContext());    addCompileUnit(DICompileUnit(Context));  }  /// processFuncStart - Process DbgFuncStartInst.  void DebugInfoFinder::processFuncStart(DbgFuncStartInst *FSI) { -  GlobalVariable *SP = dyn_cast<GlobalVariable>(FSI->getSubprogram()); +  MDNode *SP = dyn_cast<MDNode>(FSI->getSubprogram());    processSubprogram(DISubprogram(SP));  }  /// processRegionStart - Process DbgRegionStart.  void DebugInfoFinder::processRegionStart(DbgRegionStartInst *DRS) { -  GlobalVariable *SP = dyn_cast<GlobalVariable>(DRS->getContext()); +  MDNode *SP = dyn_cast<MDNode>(DRS->getContext());    processSubprogram(DISubprogram(SP));  }  /// processRegionEnd - Process DbgRegionEnd.  void DebugInfoFinder::processRegionEnd(DbgRegionEndInst *DRE) { -  GlobalVariable *SP = dyn_cast<GlobalVariable>(DRE->getContext()); +  MDNode *SP = dyn_cast<MDNode>(DRE->getContext());    processSubprogram(DISubprogram(SP));  }  /// processDeclare - Process DbgDeclareInst.  void DebugInfoFinder::processDeclare(DbgDeclareInst *DDI) { -  DIVariable DV(cast<GlobalVariable>(DDI->getVariable())); +  DIVariable DV(cast<MDNode>(DDI->getVariable()));    if (DV.isNull())      return; -  if (!NodesSeen.insert(DV.getGV())) +  if (!NodesSeen.insert(DV.getNode()))      return;    addCompileUnit(DV.getCompileUnit()); @@ -1032,10 +890,10 @@ bool DebugInfoFinder::addType(DIType DT) {    if (DT.isNull())      return false; -  if (!NodesSeen.insert(DT.getGV())) +  if (!NodesSeen.insert(DT.getNode()))      return false; -  TYs.push_back(DT.getGV()); +  TYs.push_back(DT.getNode());    return true;  } @@ -1044,10 +902,10 @@ bool DebugInfoFinder::addCompileUnit(DICompileUnit CU) {    if (CU.isNull())      return false; -  if (!NodesSeen.insert(CU.getGV())) +  if (!NodesSeen.insert(CU.getNode()))      return false; -  CUs.push_back(CU.getGV()); +  CUs.push_back(CU.getNode());    return true;  } @@ -1056,10 +914,10 @@ bool DebugInfoFinder::addGlobalVariable(DIGlobalVariable DIG) {    if (DIG.isNull())      return false; -  if (!NodesSeen.insert(DIG.getGV())) +  if (!NodesSeen.insert(DIG.getNode()))      return false; -  GVs.push_back(DIG.getGV()); +  GVs.push_back(DIG.getNode());    return true;  } @@ -1068,10 +926,10 @@ bool DebugInfoFinder::addSubprogram(DISubprogram SP) {    if (SP.isNull())      return false; -  if (!NodesSeen.insert(SP.getGV())) +  if (!NodesSeen.insert(SP.getNode()))      return false; -  SPs.push_back(SP.getGV()); +  SPs.push_back(SP.getNode());    return true;  } @@ -1124,31 +982,17 @@ namespace llvm {    Value *findDbgGlobalDeclare(GlobalVariable *V) {      const Module *M = V->getParent(); +    NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv"); +    if (!NMD) +      return 0; -    const Type *Ty = M->getTypeByName("llvm.dbg.global_variable.type"); -    if (!Ty) return 0; - -    Ty = PointerType::get(Ty, 0); - -    Value *Val = V->stripPointerCasts(); -    for (Value::use_iterator I = Val->use_begin(), E = Val->use_end(); -         I != E; ++I) { -      if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I)) { -        if (CE->getOpcode() == Instruction::BitCast) { -          Value *VV = CE; - -          while (VV->hasOneUse()) -            VV = *VV->use_begin(); - -          if (VV->getType() == Ty) -            return VV; -        } -      } +    for (unsigned i = 0, e = NMD->getNumElements(); i != e; ++i) { +      DIGlobalVariable DIG(cast_or_null<MDNode>(NMD->getElement(i))); +      if (DIG.isNull()) +        continue; +      if (DIG.getGlobal() == V) +        return DIG.getNode();      } -     -    if (Val->getType() == Ty) -      return Val; -      return 0;    } @@ -1185,7 +1029,7 @@ namespace llvm {      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(const_cast<Value*>(V))) {        Value *DIGV = findDbgGlobalDeclare(GV);        if (!DIGV) return false; -      DIGlobalVariable Var(cast<GlobalVariable>(DIGV)); +      DIGlobalVariable Var(cast<MDNode>(DIGV));        Var.getDisplayName(DisplayName);        LineNo = Var.getLineNumber(); @@ -1194,7 +1038,7 @@ namespace llvm {      } else {        const DbgDeclareInst *DDI = findDbgDeclare(V);        if (!DDI) return false; -      DIVariable Var(cast<GlobalVariable>(DDI->getVariable())); +      DIVariable Var(cast<MDNode>(DDI->getVariable()));        Var.getName(DisplayName);        LineNo = Var.getLineNumber(); @@ -1252,7 +1096,7 @@ namespace llvm {      Value *Context = SPI.getContext();      // If this location is already tracked then use it. -    DebugLocTuple Tuple(cast<GlobalVariable>(Context), SPI.getLine(),  +    DebugLocTuple Tuple(cast<MDNode>(Context), SPI.getLine(),                           SPI.getColumn());      DenseMap<DebugLocTuple, unsigned>::iterator II        = DebugLocInfo.DebugIdMap.find(Tuple); @@ -1274,12 +1118,12 @@ namespace llvm {      DebugLoc DL;      Value *SP = FSI.getSubprogram(); -    DISubprogram Subprogram(cast<GlobalVariable>(SP)); +    DISubprogram Subprogram(cast<MDNode>(SP));      unsigned Line = Subprogram.getLineNumber();      DICompileUnit CU(Subprogram.getCompileUnit());      // If this location is already tracked then use it. -    DebugLocTuple Tuple(CU.getGV(), Line, /* Column */ 0); +    DebugLocTuple Tuple(CU.getNode(), Line, /* Column */ 0);      DenseMap<DebugLocTuple, unsigned>::iterator II        = DebugLocInfo.DebugIdMap.find(Tuple);      if (II != DebugLocInfo.DebugIdMap.end()) @@ -1295,7 +1139,7 @@ namespace llvm {    /// isInlinedFnStart - Return true if FSI is starting an inlined function.    bool isInlinedFnStart(DbgFuncStartInst &FSI, const Function *CurrentFn) { -    DISubprogram Subprogram(cast<GlobalVariable>(FSI.getSubprogram())); +    DISubprogram Subprogram(cast<MDNode>(FSI.getSubprogram()));      if (Subprogram.describes(CurrentFn))        return false; @@ -1304,11 +1148,10 @@ namespace llvm {    /// isInlinedFnEnd - Return true if REI is ending an inlined function.    bool isInlinedFnEnd(DbgRegionEndInst &REI, const Function *CurrentFn) { -    DISubprogram Subprogram(cast<GlobalVariable>(REI.getContext())); +    DISubprogram Subprogram(cast<MDNode>(REI.getContext()));      if (Subprogram.isNull() || Subprogram.describes(CurrentFn))        return false;      return true;    } -  } diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index ee084311e13..784672acef2 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -98,6 +98,8 @@ bool LLParser::ValidateEndOfModule() {    for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; )      UpgradeCallsToIntrinsic(FI++); // must be post-increment, as we remove +  // Check debug info intrinsics. +  CheckDebugInfoIntrinsics(M);    return false;  } diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index bc64bc1b8e4..f9cfe916252 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -16,7 +16,7 @@  #include "llvm/Constants.h"  #include "llvm/DerivedTypes.h"  #include "llvm/InlineAsm.h" -#include "llvm/Instructions.h" +#include "llvm/IntrinsicInst.h"  #include "llvm/LLVMContext.h"  #include "llvm/Metadata.h"  #include "llvm/Module.h" @@ -2192,7 +2192,10 @@ Module *BitcodeReader::materializeModule(std::string *ErrInfo) {      }    }    std::vector<std::pair<Function*, Function*> >().swap(UpgradedIntrinsics); -   + +  // Check debug info intrinsics. +  CheckDebugInfoIntrinsics(TheModule); +    return TheModule;  } diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index c8099c8b188..23f62dba2c1 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1739,11 +1739,10 @@ void AsmPrinter::EmitComments(const MachineInstr &MI) const {    // Print source line info.    O.PadToColumn(MAI->getCommentColumn());    O << MAI->getCommentString() << " SrcLine "; -  if (DLT.CompileUnit->hasInitializer()) { -    Constant *Name = DLT.CompileUnit->getInitializer(); -    if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name)) -      if (NameString->isString()) -        O << NameString->getAsString() << " "; +  if (DLT.CompileUnit) { +    std::string Str; +    DICompileUnit CU(DLT.CompileUnit); +    O << CU.getFilename(Str) << " ";    }    O << DLT.Line;    if (DLT.Col != 0)  @@ -1761,11 +1760,10 @@ void AsmPrinter::EmitComments(const MCInst &MI) const {    // Print source line info    O.PadToColumn(MAI->getCommentColumn());    O << MAI->getCommentString() << " SrcLine "; -  if (DLT.CompileUnit->hasInitializer()) { -    Constant *Name = DLT.CompileUnit->getInitializer(); -    if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name)) -      if (NameString->isString()) -        O << NameString->getAsString() << " "; +  if (DLT.CompileUnit) { +    std::string Str; +    DICompileUnit CU(DLT.CompileUnit); +    O << CU.getFilename(Str) << " ";    }    O << DLT.Line;    if (DLT.Col != 0)  diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 5e99d7d7e98..efa7577c627 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -10,7 +10,7 @@  // This file contains support for writing dwarf debug info into asm files.  //  //===----------------------------------------------------------------------===// - +#define DEBUG_TYPE "dwarfdebug"  #include "DwarfDebug.h"  #include "llvm/Module.h"  #include "llvm/CodeGen/MachineFunction.h" @@ -24,6 +24,7 @@  #include "llvm/Target/TargetRegisterInfo.h"  #include "llvm/ADT/StringExtras.h"  #include "llvm/Support/Timer.h" +#include "llvm/Support/Debug.h"  #include "llvm/System/Path.h"  using namespace llvm; @@ -56,11 +57,13 @@ class VISIBILITY_HIDDEN CompileUnit {    /// GVToDieMap - Tracks the mapping of unit level debug informaton    /// variables to debug information entries. -  std::map<GlobalVariable *, DIE *> GVToDieMap; +  /// FIXME : Rename GVToDieMap -> NodeToDieMap +  std::map<MDNode *, DIE *> GVToDieMap;    /// GVToDIEEntryMap - Tracks the mapping of unit level debug informaton    /// descriptors to debug information entries using a DIEEntry proxy. -  std::map<GlobalVariable *, DIEEntry *> GVToDIEEntryMap; +  /// FIXME : Rename +  std::map<MDNode *, DIEEntry *> GVToDIEEntryMap;    /// Globals - A map of globally visible named entities for this unit.    /// @@ -89,12 +92,12 @@ public:    /// getDieMapSlotFor - Returns the debug information entry map slot for the    /// specified debug variable. -  DIE *&getDieMapSlotFor(GlobalVariable *GV) { return GVToDieMap[GV]; } +  DIE *&getDieMapSlotFor(MDNode *N) { return GVToDieMap[N]; }    /// getDIEEntrySlotFor - Returns the debug information entry proxy slot for    /// the specified debug variable. -  DIEEntry *&getDIEEntrySlotFor(GlobalVariable *GV) { -    return GVToDIEEntryMap[GV]; +  DIEEntry *&getDIEEntrySlotFor(MDNode *N) { +    return GVToDIEEntryMap[N];    }    /// AddDie - Adds or interns the DIE to the compile unit. @@ -239,7 +242,7 @@ DwarfDebug::~DwarfDebug() {    for (unsigned j = 0, M = Values.size(); j < M; ++j)      delete Values[j]; -  for (DenseMap<const GlobalVariable *, DbgScope *>::iterator +  for (DenseMap<const MDNode *, DbgScope *>::iterator           I = AbstractInstanceRootMap.begin(),           E = AbstractInstanceRootMap.end(); I != E;++I)      delete I->second; @@ -531,7 +534,7 @@ void DwarfDebug::AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {      return;    // Check for pre-existence. -  DIEEntry *&Slot = DW_Unit->getDIEEntrySlotFor(Ty.getGV()); +  DIEEntry *&Slot = DW_Unit->getDIEEntrySlotFor(Ty.getNode());    // If it exists then use the existing value.    if (Slot) { @@ -545,19 +548,20 @@ void DwarfDebug::AddType(CompileUnit *DW_Unit, DIE *Entity, DIType Ty) {    // Construct type.    DIE Buffer(dwarf::DW_TAG_base_type);    if (Ty.isBasicType(Ty.getTag())) -    ConstructTypeDIE(DW_Unit, Buffer, DIBasicType(Ty.getGV())); -  else if (Ty.isDerivedType(Ty.getTag())) -    ConstructTypeDIE(DW_Unit, Buffer, DIDerivedType(Ty.getGV())); +    ConstructTypeDIE(DW_Unit, Buffer, DIBasicType(Ty.getNode())); +  else if (Ty.isCompositeType(Ty.getTag())) +    ConstructTypeDIE(DW_Unit, Buffer, DICompositeType(Ty.getNode()));    else { -    assert(Ty.isCompositeType(Ty.getTag()) && "Unknown kind of DIType"); -    ConstructTypeDIE(DW_Unit, Buffer, DICompositeType(Ty.getGV())); +    assert(Ty.isDerivedType(Ty.getTag()) && "Unknown kind of DIType"); +    ConstructTypeDIE(DW_Unit, Buffer, DIDerivedType(Ty.getNode())); +    }    // Add debug information entry to entity and appropriate context.    DIE *Die = NULL;    DIDescriptor Context = Ty.getContext();    if (!Context.isNull()) -    Die = DW_Unit->getDieMapSlotFor(Context.getGV()); +    Die = DW_Unit->getDieMapSlotFor(Context.getNode());    if (Die) {      DIE *Child = new DIE(Buffer); @@ -642,7 +646,7 @@ void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,      // Add enumerators to enumeration type.      for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {        DIE *ElemDie = NULL; -      DIEnumerator Enum(Elements.getElement(i).getGV()); +      DIEnumerator Enum(Elements.getElement(i).getNode());        ElemDie = ConstructEnumTypeDIE(DW_Unit, &Enum);        Buffer.AddChild(ElemDie);      } @@ -652,7 +656,7 @@ void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,      // Add return type.      DIArray Elements = CTy.getTypeArray();      DIDescriptor RTy = Elements.getElement(0); -    AddType(DW_Unit, &Buffer, DIType(RTy.getGV())); +    AddType(DW_Unit, &Buffer, DIType(RTy.getNode()));      // Add prototype flag.      AddUInt(&Buffer, dwarf::DW_AT_prototyped, dwarf::DW_FORM_flag, 1); @@ -661,7 +665,7 @@ void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,      for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) {        DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);        DIDescriptor Ty = Elements.getElement(i); -      AddType(DW_Unit, Arg, DIType(Ty.getGV())); +      AddType(DW_Unit, Arg, DIType(Ty.getNode()));        Buffer.AddChild(Arg);      }    } @@ -679,13 +683,15 @@ void DwarfDebug::ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,      // Add elements to structure type.      for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {        DIDescriptor Element = Elements.getElement(i); +      if (Element.isNull()) +        continue;        DIE *ElemDie = NULL;        if (Element.getTag() == dwarf::DW_TAG_subprogram)          ElemDie = CreateSubprogramDIE(DW_Unit, -                                      DISubprogram(Element.getGV())); +                                      DISubprogram(Element.getNode()));        else          ElemDie = CreateMemberDIE(DW_Unit, -                                  DIDerivedType(Element.getGV())); +                                  DIDerivedType(Element.getNode()));        Buffer.AddChild(ElemDie);      } @@ -762,7 +768,7 @@ void DwarfDebug::ConstructArrayTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {      DIDescriptor Element = Elements.getElement(i);      if (Element.getTag() == dwarf::DW_TAG_subrange_type) -      ConstructSubrangeDIE(Buffer, DISubrange(Element.getGV()), IndexTy); +      ConstructSubrangeDIE(Buffer, DISubrange(Element.getNode()), IndexTy);    }  } @@ -889,7 +895,7 @@ DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,      if (Args.isNull() || SPTag != dwarf::DW_TAG_subroutine_type)        AddType(DW_Unit, SPDie, SPTy);      else -      AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getGV())); +      AddType(DW_Unit, SPDie, DIType(Args.getElement(0).getNode()));    }    if (!SP.isDefinition()) { @@ -900,7 +906,7 @@ DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,      if (SPTag == dwarf::DW_TAG_subroutine_type)        for (unsigned i = 1, N =  Args.getNumElements(); i < N; ++i) {          DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); -        AddType(DW_Unit, Arg, DIType(Args.getElement(i).getGV())); +        AddType(DW_Unit, Arg, DIType(Args.getElement(i).getNode()));          AddUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1); // ??          SPDie->AddChild(Arg);        } @@ -910,7 +916,7 @@ DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,      AddUInt(SPDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);    // DW_TAG_inlined_subroutine may refer to this DIE. -  DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getGV()); +  DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getNode());    Slot = SPDie;    return SPDie;  } @@ -919,7 +925,7 @@ DIE *DwarfDebug::CreateSubprogramDIE(CompileUnit *DW_Unit,  ///  CompileUnit &DwarfDebug::FindCompileUnit(DICompileUnit Unit) const {    DenseMap<Value *, CompileUnit *>::const_iterator I = -    CompileUnitMap.find(Unit.getGV()); +    CompileUnitMap.find(Unit.getNode());    assert(I != CompileUnitMap.end() && "Missing compile unit.");    return *I->second;  } @@ -972,26 +978,26 @@ DIE *DwarfDebug::CreateDbgScopeVariable(DbgVariable *DV, CompileUnit *Unit) {  /// getOrCreateScope - Returns the scope associated with the given descriptor.  /// -DbgScope *DwarfDebug::getOrCreateScope(GlobalVariable *V) { -  DbgScope *&Slot = DbgScopeMap[V]; +DbgScope *DwarfDebug::getOrCreateScope(MDNode *N) { +  DbgScope *&Slot = DbgScopeMap[N];    if (Slot) return Slot;    DbgScope *Parent = NULL; -  DIBlock Block(V); +  DIBlock Block(N);    // Don't create a new scope if we already created one for an inlined function. -  DenseMap<const GlobalVariable *, DbgScope *>::iterator -    II = AbstractInstanceRootMap.find(V); +  DenseMap<const MDNode *, DbgScope *>::iterator +    II = AbstractInstanceRootMap.find(N);    if (II != AbstractInstanceRootMap.end())      return LexicalScopeStack.back();    if (!Block.isNull()) {      DIDescriptor ParentDesc = Block.getContext();      Parent = -      ParentDesc.isNull() ?  NULL : getOrCreateScope(ParentDesc.getGV()); +      ParentDesc.isNull() ?  NULL : getOrCreateScope(ParentDesc.getNode());    } -  Slot = new DbgScope(Parent, DIDescriptor(V)); +  Slot = new DbgScope(Parent, DIDescriptor(N));    if (Parent)      Parent->AddScope(Slot); @@ -1100,10 +1106,10 @@ void DwarfDebug::ConstructFunctionDbgScope(DbgScope *RootScope,      return;    // Get the subprogram debug information entry. -  DISubprogram SPD(Desc.getGV()); +  DISubprogram SPD(Desc.getNode());    // Get the subprogram die. -  DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getGV()); +  DIE *SPDie = ModuleCU->getDieMapSlotFor(SPD.getNode());    assert(SPDie && "Missing subprogram descriptor");    if (!AbstractScope) { @@ -1176,8 +1182,8 @@ unsigned DwarfDebug::GetOrCreateSourceID(const std::string &DirName,    return SrcId;  } -void DwarfDebug::ConstructCompileUnit(GlobalVariable *GV) { -  DICompileUnit DIUnit(GV); +void DwarfDebug::ConstructCompileUnit(MDNode *N) { +  DICompileUnit DIUnit(N);    std::string Dir, FN, Prod;    unsigned ID = GetOrCreateSourceID(DIUnit.getDirectory(Dir),                                      DIUnit.getFilename(FN)); @@ -1214,15 +1220,15 @@ void DwarfDebug::ConstructCompileUnit(GlobalVariable *GV) {      ModuleCU = Unit;    } -  CompileUnitMap[DIUnit.getGV()] = Unit; +  CompileUnitMap[DIUnit.getNode()] = Unit;    CompileUnits.push_back(Unit);  } -void DwarfDebug::ConstructGlobalVariableDIE(GlobalVariable *GV) { -  DIGlobalVariable DI_GV(GV); +void DwarfDebug::ConstructGlobalVariableDIE(MDNode *N) { +  DIGlobalVariable DI_GV(N);    // Check for pre-existence. -  DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getGV()); +  DIE *&Slot = ModuleCU->getDieMapSlotFor(DI_GV.getNode());    if (Slot)      return; @@ -1248,11 +1254,11 @@ void DwarfDebug::ConstructGlobalVariableDIE(GlobalVariable *GV) {    return;  } -void DwarfDebug::ConstructSubprogram(GlobalVariable *GV) { -  DISubprogram SP(GV); +void DwarfDebug::ConstructSubprogram(MDNode *N) { +  DISubprogram SP(N);    // Check for pre-existence. -  DIE *&Slot = ModuleCU->getDieMapSlotFor(GV); +  DIE *&Slot = ModuleCU->getDieMapSlotFor(N);    if (Slot)      return; @@ -1535,6 +1541,9 @@ unsigned DwarfDebug::RecordSourceLine(Value *V, unsigned Line, unsigned Col) {  /// correspondence to the source line list.  unsigned DwarfDebug::RecordSourceLine(unsigned Line, unsigned Col,                                        DICompileUnit CU) { +  if (!MMI) +    return 0; +    if (TimePassesIsEnabled)      DebugTimer->startTimer(); @@ -1569,11 +1578,11 @@ unsigned DwarfDebug::getOrCreateSourceID(const std::string &DirName,  }  /// RecordRegionStart - Indicate the start of a region. -unsigned DwarfDebug::RecordRegionStart(GlobalVariable *V) { +unsigned DwarfDebug::RecordRegionStart(MDNode *N) {    if (TimePassesIsEnabled)      DebugTimer->startTimer(); -  DbgScope *Scope = getOrCreateScope(V); +  DbgScope *Scope = getOrCreateScope(N);    unsigned ID = MMI->NextLabelID();    if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);    LexicalScopeStack.push_back(Scope); @@ -1585,11 +1594,11 @@ unsigned DwarfDebug::RecordRegionStart(GlobalVariable *V) {  }  /// RecordRegionEnd - Indicate the end of a region. -unsigned DwarfDebug::RecordRegionEnd(GlobalVariable *V) { +unsigned DwarfDebug::RecordRegionEnd(MDNode *N) {    if (TimePassesIsEnabled)      DebugTimer->startTimer(); -  DbgScope *Scope = getOrCreateScope(V); +  DbgScope *Scope = getOrCreateScope(N);    unsigned ID = MMI->NextLabelID();    Scope->setEndLabelID(ID);    // FIXME : region.end() may not be in the last basic block. @@ -1606,41 +1615,36 @@ unsigned DwarfDebug::RecordRegionEnd(GlobalVariable *V) {  }  /// RecordVariable - Indicate the declaration of a local variable. -void DwarfDebug::RecordVariable(GlobalVariable *GV, unsigned FrameIndex) { +void DwarfDebug::RecordVariable(MDNode *N, unsigned FrameIndex) {    if (TimePassesIsEnabled)      DebugTimer->startTimer(); -  DIDescriptor Desc(GV); +  DIDescriptor Desc(N);    DbgScope *Scope = NULL;    bool InlinedFnVar = false; -  if (Desc.getTag() == dwarf::DW_TAG_variable) { -    // GV is a global variable. -    DIGlobalVariable DG(GV); -    Scope = getOrCreateScope(DG.getContext().getGV()); -  } else { +  if (Desc.getTag() == dwarf::DW_TAG_variable) +    Scope = getOrCreateScope(DIGlobalVariable(N).getContext().getNode()); +  else {      bool InlinedVar = false; -    DIVariable DV(GV); -    GlobalVariable *V = DV.getContext().getGV(); -    DISubprogram SP(V); +    MDNode *Context = DIVariable(N).getContext().getNode(); +    DISubprogram SP(Context);      if (!SP.isNull()) {        // SP is inserted into DbgAbstractScopeMap when inlined function        // start was recorded by RecordInlineFnStart. -      DenseMap<GlobalVariable *, DbgScope *>::iterator -        I = DbgAbstractScopeMap.find(SP.getGV()); +      DenseMap<MDNode *, DbgScope *>::iterator +        I = DbgAbstractScopeMap.find(SP.getNode());        if (I != DbgAbstractScopeMap.end()) {          InlinedVar = true;          Scope = I->second;        }      } -    if (!InlinedVar) { -      // GV is a local variable. -      Scope = getOrCreateScope(V); -    } +    if (!InlinedVar)  +      Scope = getOrCreateScope(Context);    }    assert(Scope && "Unable to find the variable's scope"); -  DbgVariable *DV = new DbgVariable(DIVariable(GV), FrameIndex, InlinedFnVar); +  DbgVariable *DV = new DbgVariable(DIVariable(N), FrameIndex, InlinedFnVar);    Scope->AddVariable(DV);    if (TimePassesIsEnabled) @@ -1658,17 +1662,17 @@ unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,    if (TimePassesIsEnabled)      DebugTimer->startTimer(); -  GlobalVariable *GV = SP.getGV(); -  DenseMap<const GlobalVariable *, DbgScope *>::iterator -    II = AbstractInstanceRootMap.find(GV); +  MDNode *Node = SP.getNode(); +  DenseMap<const MDNode *, DbgScope *>::iterator +    II = AbstractInstanceRootMap.find(Node);    if (II == AbstractInstanceRootMap.end()) {      // Create an abstract instance entry for this inlined function if it doesn't      // already exist. -    DbgScope *Scope = new DbgScope(NULL, DIDescriptor(GV)); +    DbgScope *Scope = new DbgScope(NULL, DIDescriptor(Node));      // Get the compile unit context. -    DIE *SPDie = ModuleCU->getDieMapSlotFor(GV); +    DIE *SPDie = ModuleCU->getDieMapSlotFor(Node);      if (!SPDie)        SPDie = CreateSubprogramDIE(ModuleCU, SP, false, true); @@ -1680,18 +1684,18 @@ unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,      AddUInt(SPDie, dwarf::DW_AT_inline, 0, dwarf::DW_INL_declared_not_inlined);      // Keep track of the abstract scope for this function. -    DbgAbstractScopeMap[GV] = Scope; +    DbgAbstractScopeMap[Node] = Scope; -    AbstractInstanceRootMap[GV] = Scope; +    AbstractInstanceRootMap[Node] = Scope;      AbstractInstanceRootList.push_back(Scope);    }    // Create a concrete inlined instance for this inlined function. -  DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(GV)); +  DbgConcreteScope *ConcreteScope = new DbgConcreteScope(DIDescriptor(Node));    DIE *ScopeDie = new DIE(dwarf::DW_TAG_inlined_subroutine);    ScopeDie->setAbstractCompileUnit(ModuleCU); -  DIE *Origin = ModuleCU->getDieMapSlotFor(GV); +  DIE *Origin = ModuleCU->getDieMapSlotFor(Node);    AddDIEEntry(ScopeDie, dwarf::DW_AT_abstract_origin,                dwarf::DW_FORM_ref4, Origin);    AddUInt(ScopeDie, dwarf::DW_AT_call_file, 0, ModuleCU->getID()); @@ -1705,20 +1709,20 @@ unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,    LexicalScopeStack.back()->AddConcreteInst(ConcreteScope);    // Keep track of the concrete scope that's inlined into this function. -  DenseMap<GlobalVariable *, SmallVector<DbgScope *, 8> >::iterator -    SI = DbgConcreteScopeMap.find(GV); +  DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator +    SI = DbgConcreteScopeMap.find(Node);    if (SI == DbgConcreteScopeMap.end()) -    DbgConcreteScopeMap[GV].push_back(ConcreteScope); +    DbgConcreteScopeMap[Node].push_back(ConcreteScope);    else      SI->second.push_back(ConcreteScope);    // Track the start label for this inlined function. -  DenseMap<GlobalVariable *, SmallVector<unsigned, 4> >::iterator -    I = InlineInfo.find(GV); +  DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator +    I = InlineInfo.find(Node);    if (I == InlineInfo.end()) -    InlineInfo[GV].push_back(LabelID); +    InlineInfo[Node].push_back(LabelID);    else      I->second.push_back(LabelID); @@ -1736,9 +1740,9 @@ unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {    if (TimePassesIsEnabled)      DebugTimer->startTimer(); -  GlobalVariable *GV = SP.getGV(); -  DenseMap<GlobalVariable *, SmallVector<DbgScope *, 8> >::iterator -    I = DbgConcreteScopeMap.find(GV); +  MDNode *Node = SP.getNode(); +  DenseMap<MDNode *, SmallVector<DbgScope *, 8> >::iterator +    I = DbgConcreteScopeMap.find(Node);    if (I == DbgConcreteScopeMap.end()) {      // FIXME: Can this situation actually happen? And if so, should it? @@ -2443,11 +2447,11 @@ void DwarfDebug::EmitDebugInlineInfo() {    Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");    Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)"); -  for (DenseMap<GlobalVariable *, SmallVector<unsigned, 4> >::iterator +  for (DenseMap<MDNode *, SmallVector<unsigned, 4> >::iterator           I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) { -    GlobalVariable *GV = I->first; +    MDNode *Node = I->first;      SmallVector<unsigned, 4> &Labels = I->second; -    DISubprogram SP(GV); +    DISubprogram SP(Node);      std::string Name;      std::string LName; @@ -2473,7 +2477,7 @@ void DwarfDebug::EmitDebugInlineInfo() {      for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),             LE = Labels.end(); LI != LE; ++LI) { -      DIE *SP = ModuleCU->getDieMapSlotFor(GV); +      DIE *SP = ModuleCU->getDieMapSlotFor(Node);        Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");        if (TD->getPointerSize() == sizeof(int32_t)) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index bd7cdf70b59..917d6efef3d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -139,25 +139,25 @@ class VISIBILITY_HIDDEN DwarfDebug : public Dwarf {    DbgScope *FunctionDbgScope;    /// DbgScopeMap - Tracks the scopes in the current function. -  DenseMap<GlobalVariable *, DbgScope *> DbgScopeMap; +  DenseMap<MDNode *, DbgScope *> DbgScopeMap;    /// DbgAbstractScopeMap - Tracks abstract instance scopes in the current    /// function. -  DenseMap<GlobalVariable *, DbgScope *> DbgAbstractScopeMap; +  DenseMap<MDNode *, DbgScope *> DbgAbstractScopeMap;    /// DbgConcreteScopeMap - Tracks concrete instance scopes in the current    /// function. -  DenseMap<GlobalVariable *, +  DenseMap<MDNode *,             SmallVector<DbgScope *, 8> > DbgConcreteScopeMap;    /// InlineInfo - Keep track of inlined functions and their location.  This    /// information is used to populate debug_inlined section. -  DenseMap<GlobalVariable *, SmallVector<unsigned, 4> > InlineInfo; +  DenseMap<MDNode *, SmallVector<unsigned, 4> > InlineInfo;    /// AbstractInstanceRootMap - Map of abstract instance roots of inlined    /// functions. These are subroutine entries that contain a DW_AT_inline    /// attribute. -  DenseMap<const GlobalVariable *, DbgScope *> AbstractInstanceRootMap; +  DenseMap<const MDNode *, DbgScope *> AbstractInstanceRootMap;    /// AbstractInstanceRootList - List of abstract instance roots of inlined    /// functions. These are subroutine entries that contain a DW_AT_inline @@ -335,7 +335,7 @@ class VISIBILITY_HIDDEN DwarfDebug : public Dwarf {    /// getOrCreateScope - Returns the scope associated with the given descriptor.    /// -  DbgScope *getOrCreateScope(GlobalVariable *V); +  DbgScope *getOrCreateScope(MDNode *N);    /// ConstructDbgScope - Construct the components of a scope.    /// @@ -448,11 +448,11 @@ class VISIBILITY_HIDDEN DwarfDebug : public Dwarf {    unsigned GetOrCreateSourceID(const std::string &DirName,                                 const std::string &FileName); -  void ConstructCompileUnit(GlobalVariable *GV); +  void ConstructCompileUnit(MDNode *N); -  void ConstructGlobalVariableDIE(GlobalVariable *GV); +  void ConstructGlobalVariableDIE(MDNode *N); -  void ConstructSubprogram(GlobalVariable *GV); +  void ConstructSubprogram(MDNode *N);  public:    //===--------------------------------------------------------------------===// @@ -506,13 +506,13 @@ public:                                 const std::string &FileName);    /// RecordRegionStart - Indicate the start of a region. -  unsigned RecordRegionStart(GlobalVariable *V); +  unsigned RecordRegionStart(MDNode *N);    /// RecordRegionEnd - Indicate the end of a region. -  unsigned RecordRegionEnd(GlobalVariable *V); +  unsigned RecordRegionEnd(MDNode *N);    /// RecordVariable - Indicate the declaration of  a local variable. -  void RecordVariable(GlobalVariable *GV, unsigned FrameIndex); +  void RecordVariable(MDNode *N, unsigned FrameIndex);    //// RecordInlinedFnStart - Indicate the start of inlined subroutine.    unsigned RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU, diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index 440b91c89ee..aafac71b229 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp @@ -80,13 +80,13 @@ unsigned DwarfWriter::RecordSourceLine(unsigned Line, unsigned Col,  }  /// RecordRegionStart - Indicate the start of a region. -unsigned DwarfWriter::RecordRegionStart(GlobalVariable *V) { -  return DD->RecordRegionStart(V); +unsigned DwarfWriter::RecordRegionStart(MDNode *N) { +  return DD->RecordRegionStart(N);  }  /// RecordRegionEnd - Indicate the end of a region. -unsigned DwarfWriter::RecordRegionEnd(GlobalVariable *V) { -  return DD->RecordRegionEnd(V); +unsigned DwarfWriter::RecordRegionEnd(MDNode *N) { +  return DD->RecordRegionEnd(N);  }  /// getRecordSourceLineCount - Count source lines. @@ -96,8 +96,8 @@ unsigned DwarfWriter::getRecordSourceLineCount() {  /// RecordVariable - Indicate the declaration of  a local variable.  /// -void DwarfWriter::RecordVariable(GlobalVariable *GV, unsigned FrameIndex) { -  DD->RecordVariable(GV, FrameIndex); +void DwarfWriter::RecordVariable(MDNode *N, unsigned FrameIndex) { +  DD->RecordVariable(N, FrameIndex);  }  /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should @@ -106,8 +106,7 @@ bool DwarfWriter::ShouldEmitDwarfDebug() const {    return DD && DD->ShouldEmitDwarfDebug();  } -//// RecordInlinedFnStart - Global variable GV is inlined at the location marked -//// by LabelID label. +//// RecordInlinedFnStart  unsigned DwarfWriter::RecordInlinedFnStart(DISubprogram SP, DICompileUnit CU,                                             unsigned Line, unsigned Col) {    return DD->RecordInlinedFnStart(SP, CU, Line, Col); diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index 25dfa6e1ba5..14ba36011f0 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -333,7 +333,7 @@ unsigned MachineFunction::addLiveIn(unsigned PReg,  /// getOrCreateDebugLocID - Look up the DebugLocTuple index with the given  /// source file, line, and column. If none currently exists, create a new  /// DebugLocTuple, and insert it into the DebugIdMap. -unsigned MachineFunction::getOrCreateDebugLocID(GlobalVariable *CompileUnit, +unsigned MachineFunction::getOrCreateDebugLocID(MDNode *CompileUnit,                                                  unsigned Line, unsigned Col) {    DebugLocTuple Tuple(CompileUnit, Line, Col);    DenseMap<DebugLocTuple, unsigned>::iterator II diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index 4c60b29e91b..5b4c79a9fd9 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -335,7 +335,7 @@ bool FastISel::SelectCall(User *I) {      if (isValidDebugInfoIntrinsic(*RSI, CodeGenOpt::None) && DW          && DW->ShouldEmitDwarfDebug()) {        unsigned ID =  -        DW->RecordRegionStart(cast<GlobalVariable>(RSI->getContext())); +        DW->RecordRegionStart(RSI->getContext());        const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);        BuildMI(MBB, DL, II).addImm(ID);      } @@ -346,7 +346,7 @@ bool FastISel::SelectCall(User *I) {      if (isValidDebugInfoIntrinsic(*REI, CodeGenOpt::None) && DW          && DW->ShouldEmitDwarfDebug()) {       unsigned ID = 0; -     DISubprogram Subprogram(cast<GlobalVariable>(REI->getContext())); +     DISubprogram Subprogram(REI->getContext());       if (isInlinedFnEnd(*REI, MF.getFunction())) {          // This is end of an inlined function.          const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); @@ -359,7 +359,7 @@ bool FastISel::SelectCall(User *I) {            BuildMI(MBB, DL, II).addImm(ID);        } else {          const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); -        ID =  DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext())); +        ID =  DW->RecordRegionEnd(REI->getContext());          BuildMI(MBB, DL, II).addImm(ID);        }      } @@ -384,7 +384,7 @@ bool FastISel::SelectCall(User *I) {        setCurDebugLoc(ExtractDebugLocation(*FSI, MF.getDebugLocInfo()));        DebugLocTuple PrevLocTpl = MF.getDebugLocTuple(PrevLoc); -      DISubprogram SP(cast<GlobalVariable>(FSI->getSubprogram())); +      DISubprogram SP(FSI->getSubprogram());        unsigned LabelID = DW->RecordInlinedFnStart(SP,                                                    DICompileUnit(PrevLocTpl.CompileUnit),                                                    PrevLocTpl.Line, @@ -398,7 +398,7 @@ bool FastISel::SelectCall(User *I) {      MF.setDefaultDebugLoc(ExtractDebugLocation(*FSI, MF.getDebugLocInfo()));      // llvm.dbg.func_start also defines beginning of function scope. -    DW->RecordRegionStart(cast<GlobalVariable>(FSI->getSubprogram())); +    DW->RecordRegionStart(FSI->getSubprogram());      return true;    }    case Intrinsic::dbg_declare: { @@ -419,10 +419,7 @@ bool FastISel::SelectCall(User *I) {      if (SI == StaticAllocaMap.end()) break; // VLAs.      int FI = SI->second; -    // Determine the debug globalvariable. -    GlobalValue *GV = cast<GlobalVariable>(Variable); -     -    DW->RecordVariable(cast<GlobalVariable>(GV), FI); +    DW->RecordVariable(cast<MDNode>(Variable), FI);      return true;    }    case Intrinsic::eh_exception: { diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 959a9205cac..4ed83db2697 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1596,9 +1596,9 @@ SDValue SelectionDAGLegalize::ExpandDBG_STOPPOINT(SDNode* Node) {    bool useLABEL = TLI.isOperationLegalOrCustom(ISD::DBG_LABEL, MVT::Other);    const DbgStopPointSDNode *DSP = cast<DbgStopPointSDNode>(Node); -  GlobalVariable *CU_GV = cast<GlobalVariable>(DSP->getCompileUnit()); -  if (DW && (useDEBUG_LOC || useLABEL) && !CU_GV->isDeclaration()) { -    DICompileUnit CU(cast<GlobalVariable>(DSP->getCompileUnit())); +  MDNode *CU_Node = DSP->getCompileUnit(); +  if (DW && (useDEBUG_LOC || useLABEL)) { +    DICompileUnit CU(CU_Node);      unsigned Line = DSP->getLine();      unsigned Col = DSP->getColumn(); @@ -1610,7 +1610,7 @@ SDValue SelectionDAGLegalize::ExpandDBG_STOPPOINT(SDNode* Node) {          return DAG.getNode(ISD::DEBUG_LOC, dl, MVT::Other, Node->getOperand(0),                             DAG.getConstant(Line, MVT::i32),                             DAG.getConstant(Col, MVT::i32), -                           DAG.getSrcValue(CU.getGV())); +                           DAG.getSrcValue(CU.getNode()));        } else {          unsigned ID = DW->RecordSourceLine(Line, Col, CU);          return DAG.getLabel(ISD::DBG_LABEL, dl, Node->getOperand(0), ID); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index ee58d2effd5..11f12c9475f 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1286,7 +1286,7 @@ SDValue SelectionDAG::getRegister(unsigned RegNo, EVT VT) {  SDValue SelectionDAG::getDbgStopPoint(DebugLoc DL, SDValue Root,                                        unsigned Line, unsigned Col, -                                      Value *CU) { +                                      MDNode *CU) {    SDNode *N = NodeAllocator.Allocate<DbgStopPointSDNode>();    new (N) DbgStopPointSDNode(Root, Line, Col, CU);    N->setDebugLoc(DL); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index a4cd009bd93..0a161d0dcad 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -3876,7 +3876,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {      if (isValidDebugInfoIntrinsic(RSI, OptLevel) && DW          && DW->ShouldEmitDwarfDebug()) {        unsigned LabelID = -        DW->RecordRegionStart(cast<GlobalVariable>(RSI.getContext())); +        DW->RecordRegionStart(RSI.getContext());        DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),                                 getRoot(), LabelID));      } @@ -3891,7 +3891,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {        return 0;      MachineFunction &MF = DAG.getMachineFunction(); -    DISubprogram Subprogram(cast<GlobalVariable>(REI.getContext())); +    DISubprogram Subprogram(REI.getContext());      if (isInlinedFnEnd(REI, MF.getFunction())) {        // This is end of inlined function. Debugging information for inlined @@ -3910,7 +3910,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {      }       unsigned LabelID = -      DW->RecordRegionEnd(cast<GlobalVariable>(REI.getContext())); +      DW->RecordRegionEnd(REI.getContext());      DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),                               getRoot(), LabelID));      return 0; @@ -3942,7 +3942,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {        if (!DW || !DW->ShouldEmitDwarfDebug())          return 0;        DebugLocTuple PrevLocTpl = MF.getDebugLocTuple(PrevLoc); -      DISubprogram SP(cast<GlobalVariable>(FSI.getSubprogram())); +      DISubprogram SP(FSI.getSubprogram());        DICompileUnit CU(PrevLocTpl.CompileUnit);        unsigned LabelID = DW->RecordInlinedFnStart(SP, CU,                                                    PrevLocTpl.Line, @@ -3958,7 +3958,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {      if (!DW || !DW->ShouldEmitDwarfDebug())        return 0;      // llvm.dbg.func_start also defines beginning of function scope. -    DW->RecordRegionStart(cast<GlobalVariable>(FSI.getSubprogram())); +    DW->RecordRegionStart(FSI.getSubprogram());      return 0;    }    case Intrinsic::dbg_declare: { @@ -3981,7 +3981,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {      if (!AI)        return 0;      int FI = FuncInfo.StaticAllocaMap[AI]; -    DW->RecordVariable(cast<GlobalVariable>(Variable), FI); +    DW->RecordVariable(cast<MDNode>(Variable), FI);      return 0;    }    case Intrinsic::eh_exception: { diff --git a/llvm/lib/Target/PIC16/PIC16DebugInfo.cpp b/llvm/lib/Target/PIC16/PIC16DebugInfo.cpp index 19927cb8b30..4dcd84dc57e 100644 --- a/llvm/lib/Target/PIC16/PIC16DebugInfo.cpp +++ b/llvm/lib/Target/PIC16/PIC16DebugInfo.cpp @@ -1,3 +1,4 @@ +  //===-- PIC16DebugInfo.cpp - Implementation for PIC16 Debug Information ======//  //  //                     The LLVM Compiler Infrastructure @@ -69,7 +70,7 @@ void PIC16DbgInfo::PopulateDerivedTypeInfo (DIType Ty, unsigned short &TypeNo,    // We also need to encode the the information about the base type of    // pointer in TypeNo. -  DIType BaseType = DIDerivedType(Ty.getGV()).getTypeDerivedFrom(); +  DIType BaseType = DIDerivedType(Ty.getNode()).getTypeDerivedFrom();    PopulateDebugInfo(BaseType, TypeNo, HasAux, Aux, TagName);  } @@ -78,7 +79,7 @@ void PIC16DbgInfo::PopulateArrayTypeInfo (DIType Ty, unsigned short &TypeNo,                                            bool &HasAux, int Aux[],                                            std::string &TagName) { -  DICompositeType CTy = DICompositeType(Ty.getGV()); +  DICompositeType CTy = DICompositeType(Ty.getNode());    DIArray Elements = CTy.getTypeArray();    unsigned short size = 1;    unsigned short Dimension[4]={0,0,0,0}; @@ -87,7 +88,7 @@ void PIC16DbgInfo::PopulateArrayTypeInfo (DIType Ty, unsigned short &TypeNo,      if (Element.getTag() == dwarf::DW_TAG_subrange_type) {        TypeNo = TypeNo << PIC16Dbg::S_DERIVED;        TypeNo = TypeNo | PIC16Dbg::DT_ARY; -      DISubrange SubRange = DISubrange(Element.getGV()); +      DISubrange SubRange = DISubrange(Element.getNode());        Dimension[i] = SubRange.getHi() - SubRange.getLo() + 1;        // Each dimension is represented by 2 bytes starting at byte 9.        Aux[8+i*2+0] = Dimension[i]; @@ -110,7 +111,7 @@ void PIC16DbgInfo::PopulateStructOrUnionTypeInfo (DIType Ty,                                                    unsigned short &TypeNo,                                                    bool &HasAux, int Aux[],                                                    std::string &TagName) { -  DICompositeType CTy = DICompositeType(Ty.getGV()); +  DICompositeType CTy = DICompositeType(Ty.getNode());    TypeNo = TypeNo << PIC16Dbg::S_BASIC;    if (Ty.getTag() == dwarf::DW_TAG_structure_type)      TypeNo = TypeNo | PIC16Dbg::T_STRUCT; @@ -123,7 +124,7 @@ void PIC16DbgInfo::PopulateStructOrUnionTypeInfo (DIType Ty,    // llvm.dbg.composite* global variable. Since we need to revisit     // PIC16DebugInfo implementation anyways after the MDNodes based     // framework is done, let us continue with the way it is. -  std::string UniqueSuffix = "." + Ty.getGV()->getNameStr().substr(18); +  std::string UniqueSuffix = "." + Ty.getNode()->getNameStr().substr(18);    TagName += UniqueSuffix;    unsigned short size = CTy.getSizeInBits()/8;    // 7th and 8th byte represent size. @@ -210,11 +211,10 @@ void PIC16DbgInfo::BeginModule(Module &M) {    DbgFinder.processModule(M);    if (DbgFinder.compile_unit_count() != 0) {      // FIXME : What if more then one CUs are present in a module ? -    GlobalVariable *CU = *DbgFinder.compile_unit_begin(); +    MDNode *CU = *DbgFinder.compile_unit_begin();      EmitDebugDirectives = true;      SwitchToCU(CU);    } -    // Emit debug info for decls of composite types.    EmitCompositeTypeDecls(M);  } @@ -259,7 +259,7 @@ void PIC16DbgInfo::ChangeDebugLoc(const MachineFunction &MF,    if (! EmitDebugDirectives) return;    assert (! DL.isUnknown()  && "can't change to invalid debug loc"); -  GlobalVariable *CU = MF.getDebugLocTuple(DL).CompileUnit; +  MDNode *CU = MF.getDebugLocTuple(DL).CompileUnit;    unsigned line = MF.getDebugLocTuple(DL).Line;    SwitchToCU(CU); @@ -306,8 +306,7 @@ void PIC16DbgInfo::EmitCompositeTypeElements (DICompositeType CTy,      int ElementAux[PIC16Dbg::AuxSize] = { 0 };      std::string TagName = "";      std::string ElementName; -    GlobalVariable *GV = Element.getGV(); -    DIDerivedType DITy(GV); +    DIDerivedType DITy(Element.getNode());      DITy.getName(ElementName);      unsigned short ElementSize = DITy.getSizeInBits()/8;      // Get mangleddd name for this structure/union  element. @@ -343,7 +342,7 @@ void PIC16DbgInfo::EmitCompositeTypeDecls(Module &M) {        CTy.getName(Name);        // Get the number after llvm.dbg.composite and make UniqueSuffix from         // it. -      std::string DIVar = CTy.getGV()->getNameStr(); +      std::string DIVar = CTy.getNode()->getNameStr();        std::string UniqueSuffix = "." + DIVar.substr(18);        std::string MangledCTyName = Name + UniqueSuffix;        unsigned short size = CTy.getSizeInBits()/8; @@ -441,7 +440,7 @@ void PIC16DbgInfo::EmitSymbol(std::string Name, short Class, unsigned short  void PIC16DbgInfo::EmitVarDebugInfo(Module &M) {    DebugInfoFinder DbgFinder;    DbgFinder.processModule(M); - +      for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(),           E = DbgFinder.global_variable_end(); I != E; ++I) {      DIGlobalVariable DIGV(*I); @@ -466,7 +465,7 @@ void PIC16DbgInfo::EmitVarDebugInfo(Module &M) {  /// SwitchToCU - Switch to a new compilation unit.  /// -void PIC16DbgInfo::SwitchToCU(GlobalVariable *CU) { +void PIC16DbgInfo::SwitchToCU(MDNode *CU) {    // Get the file path from CU.    DICompileUnit cu(CU);    std::string DirName, FileName; diff --git a/llvm/lib/Target/PIC16/PIC16DebugInfo.h b/llvm/lib/Target/PIC16/PIC16DebugInfo.h index 2ccaba32372..54e27c7c337 100644 --- a/llvm/lib/Target/PIC16/PIC16DebugInfo.h +++ b/llvm/lib/Target/PIC16/PIC16DebugInfo.h @@ -117,7 +117,7 @@ namespace llvm {      private: -    void SwitchToCU (GlobalVariable *CU); +    void SwitchToCU (MDNode *CU);      void SwitchToLine (unsigned Line, bool IsInBeginFunction = false);      void PopulateDebugInfo (DIType Ty, unsigned short &TypeNo, bool &HasAux, diff --git a/llvm/lib/Transforms/IPO/StripSymbols.cpp b/llvm/lib/Transforms/IPO/StripSymbols.cpp index 316b0d79750..0bd1696f7f8 100644 --- a/llvm/lib/Transforms/IPO/StripSymbols.cpp +++ b/llvm/lib/Transforms/IPO/StripSymbols.cpp @@ -203,167 +203,56 @@ static bool StripSymbolNames(Module &M, bool PreserveDbgInfo) {  // llvm.dbg.region.end calls, and any globals they point to if now dead.  static bool StripDebugInfo(Module &M) { -  SmallPtrSet<const GlobalValue*, 8> llvmUsedValues; -  findUsedValues(M.getGlobalVariable("llvm.used"), llvmUsedValues); -  findUsedValues(M.getGlobalVariable("llvm.compiler.used"), llvmUsedValues); - -  DebugInfoFinder DbgFinder; -  DbgFinder.processModule(M); - -  // These anchors use LinkOnce linkage so that the optimizer does not -  // remove them accidently. Set InternalLinkage for all these debug -  // info anchors. -  for (DebugInfoFinder::iterator I = DbgFinder.compile_unit_begin(), -         E = DbgFinder.compile_unit_end(); I != E; ++I) -    (*I)->setLinkage(GlobalValue::InternalLinkage); -  for (DebugInfoFinder::iterator I = DbgFinder.global_variable_begin(), -         E = DbgFinder.global_variable_end(); I != E; ++I) -    (*I)->setLinkage(GlobalValue::InternalLinkage); -  for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(), -         E = DbgFinder.subprogram_end(); I != E; ++I) -    (*I)->setLinkage(GlobalValue::InternalLinkage); - - - // Delete all dbg variables. -  for (Module::global_iterator I = M.global_begin(), E = M.global_end();  -       I != E; ++I) { -    GlobalVariable *GV = dyn_cast<GlobalVariable>(I); -    if (!GV) continue; -    if (!GV->use_empty() && llvmUsedValues.count(I) == 0) { -      if (GV->getName().startswith("llvm.dbg")) { -        GV->replaceAllUsesWith(UndefValue::get(GV->getType())); -      } -    } -  } - +  // Remove all of the calls to the debugger intrinsics, and remove them from +  // the module.    Function *FuncStart = M.getFunction("llvm.dbg.func.start");    Function *StopPoint = M.getFunction("llvm.dbg.stoppoint");    Function *RegionStart = M.getFunction("llvm.dbg.region.start");    Function *RegionEnd = M.getFunction("llvm.dbg.region.end");    Function *Declare = M.getFunction("llvm.dbg.declare"); -  std::vector<Constant*> DeadConstants; - -  // Remove all of the calls to the debugger intrinsics, and remove them from -  // the module.    if (FuncStart) {      while (!FuncStart->use_empty()) {        CallInst *CI = cast<CallInst>(FuncStart->use_back()); -      Value *Arg = CI->getOperand(1); -      assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");        CI->eraseFromParent(); -      if (Arg->use_empty()) -        if (Constant *C = dyn_cast<Constant>(Arg))  -          DeadConstants.push_back(C);      }      FuncStart->eraseFromParent();    }    if (StopPoint) {      while (!StopPoint->use_empty()) {        CallInst *CI = cast<CallInst>(StopPoint->use_back()); -      Value *Arg = CI->getOperand(3); -      assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");        CI->eraseFromParent(); -      if (Arg->use_empty()) -        if (Constant *C = dyn_cast<Constant>(Arg))  -          DeadConstants.push_back(C);      }      StopPoint->eraseFromParent();    }    if (RegionStart) {      while (!RegionStart->use_empty()) {        CallInst *CI = cast<CallInst>(RegionStart->use_back()); -      Value *Arg = CI->getOperand(1); -      assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");        CI->eraseFromParent(); -      if (Arg->use_empty()) -        if (Constant *C = dyn_cast<Constant>(Arg))  -          DeadConstants.push_back(C);      }      RegionStart->eraseFromParent();    }    if (RegionEnd) {      while (!RegionEnd->use_empty()) {        CallInst *CI = cast<CallInst>(RegionEnd->use_back()); -      Value *Arg = CI->getOperand(1); -      assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");        CI->eraseFromParent(); -      if (Arg->use_empty()) -        if (Constant *C = dyn_cast<Constant>(Arg))  -          DeadConstants.push_back(C);      }      RegionEnd->eraseFromParent();    }    if (Declare) {      while (!Declare->use_empty()) {        CallInst *CI = cast<CallInst>(Declare->use_back()); -      Value *Arg1 = CI->getOperand(1); -      Value *Arg2 = CI->getOperand(2); -      assert(CI->use_empty() && "llvm.dbg intrinsic should have void result");        CI->eraseFromParent(); -      if (Arg1->use_empty()) { -        if (Constant *C = dyn_cast<Constant>(Arg1))  -          DeadConstants.push_back(C); -        else  -          RecursivelyDeleteTriviallyDeadInstructions(Arg1); -      } -      if (Arg2->use_empty()) -        if (Constant *C = dyn_cast<Constant>(Arg2))  -          DeadConstants.push_back(C);      }      Declare->eraseFromParent();    } -  // llvm.dbg.compile_units and llvm.dbg.subprograms are marked as linkonce -  // but since we are removing all debug information, make them internal now. -  // FIXME: Use private linkage maybe? -  if (Constant *C = M.getNamedGlobal("llvm.dbg.compile_units")) -    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) -      GV->setLinkage(GlobalValue::InternalLinkage); - -  if (Constant *C = M.getNamedGlobal("llvm.dbg.subprograms")) -    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) -      GV->setLinkage(GlobalValue::InternalLinkage); -  -  if (Constant *C = M.getNamedGlobal("llvm.dbg.global_variables")) -    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) -      GV->setLinkage(GlobalValue::InternalLinkage); - -  // Delete all dbg variables. -  for (Module::global_iterator I = M.global_begin(), E = M.global_end();  -       I != E; ++I) { -    GlobalVariable *GV = dyn_cast<GlobalVariable>(I); -    if (!GV) continue; -    if (GV->use_empty() && llvmUsedValues.count(I) == 0 -        && (!GV->hasSection()  -            || strcmp(GV->getSection().c_str(), "llvm.metadata") == 0)) -      DeadConstants.push_back(GV); -  } - -  if (DeadConstants.empty()) -    return false; +  NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv"); +  if (NMD) +    NMD->eraseFromParent(); -  // Delete any internal globals that were only used by the debugger intrinsics. -  while (!DeadConstants.empty()) { -    Constant *C = DeadConstants.back(); -    DeadConstants.pop_back(); -    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) { -      if (GV->hasLocalLinkage()) -        RemoveDeadConstant(GV); -    } -    else -      RemoveDeadConstant(C); -  } - -  // Remove all llvm.dbg types. -  TypeSymbolTable &ST = M.getTypeSymbolTable(); -  for (TypeSymbolTable::iterator TI = ST.begin(), TE = ST.end(); TI != TE; ) { -    if (!strncmp(TI->first.c_str(), "llvm.dbg.", 9)) -      ST.remove(TI++); -    else  -      ++TI; -  } -   +  // Remove dead metadata. +  M.getContext().RemoveDeadMetadata();    return true;  } diff --git a/llvm/lib/Transforms/Utils/CloneFunction.cpp b/llvm/lib/Transforms/Utils/CloneFunction.cpp index a430fa00b51..fd72ca1d91a 100644 --- a/llvm/lib/Transforms/Utils/CloneFunction.cpp +++ b/llvm/lib/Transforms/Utils/CloneFunction.cpp @@ -238,7 +238,7 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,      // Do not clone llvm.dbg.region.end. It will be adjusted by the inliner.      if (const DbgFuncStartInst *DFSI = dyn_cast<DbgFuncStartInst>(II)) {        if (DbgFnStart == NULL) { -        DISubprogram SP(cast<GlobalVariable>(DFSI->getSubprogram())); +        DISubprogram SP(DFSI->getSubprogram());          if (SP.describes(BB->getParent()))            DbgFnStart = DFSI->getSubprogram();        } diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 1681009872c..4e738e498b3 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -236,17 +236,17 @@ static void UpdateCallGraphAfterInlining(CallSite CS,  ///  static const DbgRegionEndInst *findFnRegionEndMarker(const Function *F) { -  GlobalVariable *FnStart = NULL; +  MDNode *FnStart = NULL;    const DbgRegionEndInst *FnEnd = NULL;    for (Function::const_iterator FI = F->begin(), FE =F->end(); FI != FE; ++FI)       for (BasicBlock::const_iterator BI = FI->begin(), BE = FI->end(); BI != BE;           ++BI) {        if (FnStart == NULL)  {          if (const DbgFuncStartInst *FSI = dyn_cast<DbgFuncStartInst>(BI)) { -          DISubprogram SP(cast<GlobalVariable>(FSI->getSubprogram())); +          DISubprogram SP(FSI->getSubprogram());            assert (SP.isNull() == false && "Invalid llvm.dbg.func.start");            if (SP.describes(F)) -            FnStart = SP.getGV(); +            FnStart = SP.getNode();          }          continue;        } diff --git a/llvm/lib/VMCore/AutoUpgrade.cpp b/llvm/lib/VMCore/AutoUpgrade.cpp index e4c0d1afc49..3f23b8d9934 100644 --- a/llvm/lib/VMCore/AutoUpgrade.cpp +++ b/llvm/lib/VMCore/AutoUpgrade.cpp @@ -16,8 +16,7 @@  #include "llvm/Function.h"  #include "llvm/LLVMContext.h"  #include "llvm/Module.h" -#include "llvm/Instructions.h" -#include "llvm/Intrinsics.h" +#include "llvm/IntrinsicInst.h"  #include "llvm/ADT/SmallVector.h"  #include "llvm/Support/ErrorHandling.h"  #include <cstring> @@ -434,3 +433,74 @@ void llvm::UpgradeCallsToIntrinsic(Function* F) {      }    }  } + +/// This function checks debug info intrinsics. If an intrinsic is invalid +/// then this function simply removes the intrinsic.  +void llvm::CheckDebugInfoIntrinsics(Module *M) { + + +  if (Function *FuncStart = M->getFunction("llvm.dbg.func.start")) { +    if (!FuncStart->use_empty()) { +      DbgFuncStartInst *DFSI = cast<DbgFuncStartInst>(FuncStart->use_back()); +      if (!isa<MDNode>(DFSI->getOperand(1))) { +        while (!FuncStart->use_empty()) { +          CallInst *CI = cast<CallInst>(FuncStart->use_back()); +          CI->eraseFromParent(); +        } +        FuncStart->eraseFromParent(); +      } +    } +  } + +  if (Function *StopPoint = M->getFunction("llvm.dbg.stoppoint")) { +    if (!StopPoint->use_empty()) { +      DbgStopPointInst *DSPI = cast<DbgStopPointInst>(StopPoint->use_back()); +      if (!isa<MDNode>(DSPI->getOperand(3))) { +        while (!StopPoint->use_empty()) { +          CallInst *CI = cast<CallInst>(StopPoint->use_back()); +          CI->eraseFromParent(); +        } +        StopPoint->eraseFromParent(); +      } +    } +  } + +  if (Function *RegionStart = M->getFunction("llvm.dbg.region.start")) { +    if (!RegionStart->use_empty()) { +      DbgRegionStartInst *DRSI = cast<DbgRegionStartInst>(RegionStart->use_back()); +      if (!isa<MDNode>(DRSI->getOperand(1))) { +        while (!RegionStart->use_empty()) { +          CallInst *CI = cast<CallInst>(RegionStart->use_back()); +          CI->eraseFromParent(); +        } +        RegionStart->eraseFromParent(); +      } +    } +  } + +  if (Function *RegionEnd = M->getFunction("llvm.dbg.region.end")) { +    if (!RegionEnd->use_empty()) { +      DbgRegionEndInst *DREI = cast<DbgRegionEndInst>(RegionEnd->use_back()); +      if (!isa<MDNode>(DREI->getOperand(1))) { +        while (!RegionEnd->use_empty()) { +          CallInst *CI = cast<CallInst>(RegionEnd->use_back()); +          CI->eraseFromParent(); +      } +        RegionEnd->eraseFromParent(); +      } +    } +  } +   +  if (Function *Declare = M->getFunction("llvm.dbg.declare")) { +    if (!Declare->use_empty()) { +      DbgDeclareInst *DDI = cast<DbgDeclareInst>(Declare->use_back()); +      if (!isa<MDNode>(DDI->getOperand(2))) { +        while (!Declare->use_empty()) { +          CallInst *CI = cast<CallInst>(Declare->use_back()); +          CI->eraseFromParent(); +        } +        Declare->eraseFromParent(); +      } +    } +  } +} diff --git a/llvm/lib/VMCore/ValueTypes.cpp b/llvm/lib/VMCore/ValueTypes.cpp index b10b3c12002..7f9a6cde2d5 100644 --- a/llvm/lib/VMCore/ValueTypes.cpp +++ b/llvm/lib/VMCore/ValueTypes.cpp @@ -169,6 +169,7 @@ const Type *EVT::getTypeForEVT(LLVMContext &Context) const {    case MVT::v8f32:   return VectorType::get(Type::getFloatTy(Context), 8);    case MVT::v2f64:   return VectorType::get(Type::getDoubleTy(Context), 2);    case MVT::v4f64:   return VectorType::get(Type::getDoubleTy(Context), 4);  +  case MVT::Metadata: return Type::getMetadataTy(Context);   }  }  | 

