diff options
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
| -rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 252 | 
1 files changed, 200 insertions, 52 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 12a68036b09c..818b51543d30 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -107,8 +107,8 @@ void ApplyDebugLocation::init(SourceLocation TemporaryLocation,    // Construct a location that has a valid scope, but no line info.    assert(!DI->LexicalBlockStack.empty()); -  CGF->Builder.SetCurrentDebugLocation( -      llvm::DebugLoc::get(0, 0, DI->LexicalBlockStack.back())); +  CGF->Builder.SetCurrentDebugLocation(llvm::DebugLoc::get( +      0, 0, DI->LexicalBlockStack.back(), DI->getInlinedAt()));  }  ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E) @@ -134,6 +134,30 @@ ApplyDebugLocation::~ApplyDebugLocation() {      CGF->Builder.SetCurrentDebugLocation(std::move(OriginalLocation));  } +ApplyInlineDebugLocation::ApplyInlineDebugLocation(CodeGenFunction &CGF, +                                                   GlobalDecl InlinedFn) +    : CGF(&CGF) { +  if (!CGF.getDebugInfo()) { +    this->CGF = nullptr; +    return; +  } +  auto &DI = *CGF.getDebugInfo(); +  SavedLocation = DI.getLocation(); +  assert((DI.getInlinedAt() == +          CGF.Builder.getCurrentDebugLocation()->getInlinedAt()) && +         "CGDebugInfo and IRBuilder are out of sync"); + +  DI.EmitInlineFunctionStart(CGF.Builder, InlinedFn); +} + +ApplyInlineDebugLocation::~ApplyInlineDebugLocation() { +  if (!CGF) +    return; +  auto &DI = *CGF->getDebugInfo(); +  DI.EmitInlineFunctionEnd(CGF->Builder); +  DI.EmitLocation(CGF->Builder, SavedLocation); +} +  void CGDebugInfo::setLocation(SourceLocation Loc) {    // If the new location isn't valid return.    if (Loc.isInvalid()) @@ -249,8 +273,8 @@ StringRef CGDebugInfo::getObjCMethodName(const ObjCMethodDecl *OMD) {           << OC->getIdentifier()->getNameStart() << ')';      }    } else if (const auto *OCD = dyn_cast<ObjCCategoryImplDecl>(DC)) { -    OS << ((const NamedDecl *)OCD)->getIdentifier()->getNameStart() << '(' -       << OCD->getIdentifier()->getNameStart() << ')'; +    OS << OCD->getClassInterface()->getName() << '(' +       << OCD->getName() << ')';    } else if (isa<ObjCProtocolDecl>(DC)) {      // We can extract the type of the class from the self pointer.      if (ImplicitParamDecl *SelfDecl = OMD->getSelfDecl()) { @@ -509,7 +533,8 @@ void CGDebugInfo::CreateCompileUnit() {                                     Checksum),        Producer, LO.Optimize, CGM.getCodeGenOpts().DwarfDebugFlags, RuntimeVers,        CGM.getCodeGenOpts().SplitDwarfFile, EmissionKind, 0 /* DWOid */, -      CGM.getCodeGenOpts().SplitDwarfInlining); +      CGM.getCodeGenOpts().SplitDwarfInlining, +      CGM.getCodeGenOpts().DebugInfoForProfiling);  }  llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) { @@ -581,8 +606,6 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {      return getOrCreateStructPtrType("opencl_clk_event_t", OCLClkEventDITy);    case BuiltinType::OCLQueue:      return getOrCreateStructPtrType("opencl_queue_t", OCLQueueDITy); -  case BuiltinType::OCLNDRange: -    return getOrCreateStructPtrType("opencl_ndrange_t", OCLNDRangeDITy);    case BuiltinType::OCLReserveID:      return getOrCreateStructPtrType("opencl_reserve_id_t", OCLReserveIDDITy); @@ -793,17 +816,19 @@ llvm::DIType *CGDebugInfo::CreatePointerLikeType(llvm::dwarf::Tag Tag,    // Bit size, align and offset of the type.    // Size is always the size of a pointer. We can't use getTypeSize here    // because that does not return the correct value for references. -  unsigned AS = CGM.getContext().getTargetAddressSpace(PointeeTy); -  uint64_t Size = CGM.getTarget().getPointerWidth(AS); +  unsigned AddressSpace = CGM.getContext().getTargetAddressSpace(PointeeTy); +  uint64_t Size = CGM.getTarget().getPointerWidth(AddressSpace);    auto Align = getTypeAlignIfRequired(Ty, CGM.getContext()); +  Optional<unsigned> DWARFAddressSpace = +      CGM.getTarget().getDWARFAddressSpace(AddressSpace);    if (Tag == llvm::dwarf::DW_TAG_reference_type ||        Tag == llvm::dwarf::DW_TAG_rvalue_reference_type)      return DBuilder.createReferenceType(Tag, getOrCreateType(PointeeTy, Unit), -                                        Size, Align); +                                        Size, Align, DWARFAddressSpace);    else      return DBuilder.createPointerType(getOrCreateType(PointeeTy, Unit), Size, -                                      Align); +                                      Align, DWARFAddressSpace);  }  llvm::DIType *CGDebugInfo::getOrCreateStructPtrType(StringRef Name, @@ -1608,8 +1633,13 @@ llvm::DIType *CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile *Unit) {    llvm::DITypeRefArray SElements = DBuilder.getOrCreateTypeArray(STy);    llvm::DIType *SubTy = DBuilder.createSubroutineType(SElements);    unsigned Size = Context.getTypeSize(Context.VoidPtrTy); +  unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace(); +  Optional<unsigned> DWARFAddressSpace = +      CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace); +    llvm::DIType *vtbl_ptr_type = -      DBuilder.createPointerType(SubTy, Size, 0, "__vtbl_ptr_type"); +      DBuilder.createPointerType(SubTy, Size, 0, DWARFAddressSpace, +                                 "__vtbl_ptr_type");    VTablePtrType = DBuilder.createPointerType(vtbl_ptr_type, Size);    return VTablePtrType;  } @@ -1648,10 +1678,14 @@ void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,      unsigned VSlotCount =          VFTLayout.vtable_components().size() - CGM.getLangOpts().RTTIData;      unsigned VTableWidth = PtrWidth * VSlotCount; +    unsigned VtblPtrAddressSpace = CGM.getTarget().getVtblPtrAddressSpace(); +    Optional<unsigned> DWARFAddressSpace = +        CGM.getTarget().getDWARFAddressSpace(VtblPtrAddressSpace);      // Create a very wide void* type and insert it directly in the element list.      llvm::DIType *VTableType = -        DBuilder.createPointerType(nullptr, VTableWidth, 0, "__vtbl_ptr_type"); +        DBuilder.createPointerType(nullptr, VTableWidth, 0, DWARFAddressSpace, +                                   "__vtbl_ptr_type");      EltTys.push_back(VTableType);      // The vptr is a pointer to this special vtable type. @@ -1714,7 +1748,27 @@ void CGDebugInfo::completeType(const RecordDecl *RD) {      completeRequiredType(RD);  } +/// Return true if the class or any of its methods are marked dllimport. +static bool isClassOrMethodDLLImport(const CXXRecordDecl *RD) { +  if (RD->hasAttr<DLLImportAttr>()) +    return true; +  for (const CXXMethodDecl *MD : RD->methods()) +    if (MD->hasAttr<DLLImportAttr>()) +      return true; +  return false; +} +  void CGDebugInfo::completeClassData(const RecordDecl *RD) { +  if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) +    if (CXXRD->isDynamicClass() && +        CGM.getVTableLinkage(CXXRD) == +            llvm::GlobalValue::AvailableExternallyLinkage && +        !isClassOrMethodDLLImport(CXXRD)) +      return; +  completeClass(RD); +} + +void CGDebugInfo::completeClass(const RecordDecl *RD) {    if (DebugKind <= codegenoptions::DebugLineTablesOnly)      return;    QualType Ty = CGM.getContext().getRecordType(RD); @@ -1760,22 +1814,16 @@ static bool isDefinedInClangModule(const RecordDecl *RD) {    return true;  } -/// Return true if the class or any of its methods are marked dllimport. -static bool isClassOrMethodDLLImport(const CXXRecordDecl *RD) { -  if (RD->hasAttr<DLLImportAttr>()) -    return true; -  for (const CXXMethodDecl *MD : RD->methods()) -    if (MD->hasAttr<DLLImportAttr>()) -      return true; -  return false; -} -  static bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind,                                   bool DebugTypeExtRefs, const RecordDecl *RD,                                   const LangOptions &LangOpts) {    if (DebugTypeExtRefs && isDefinedInClangModule(RD->getDefinition()))      return true; +  if (auto *ES = RD->getASTContext().getExternalSource()) +    if (ES->hasExternalDefinitions(RD) == ExternalASTSource::EK_Always) +      return true; +    if (DebugKind > codegenoptions::LimitedDebugInfo)      return false; @@ -2009,7 +2057,11 @@ CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod,    if (CreateSkeletonCU && IsRootModule) {      // PCH files don't have a signature field in the control block,      // but LLVM detects skeleton CUs by looking for a non-zero DWO id. -    uint64_t Signature = Mod.getSignature() ? Mod.getSignature() : ~1ULL; +    // We use the lower 64 bits for debug info. +    uint64_t Signature = +        Mod.getSignature() +            ? (uint64_t)Mod.getSignature()[1] << 32 | Mod.getSignature()[0] +            : ~1ULL;      llvm::DIBuilder DIB(CGM.getModule());      DIB.createCompileUnit(TheCU->getSourceLanguage(),                            DIB.createFile(Mod.getModuleName(), Mod.getPath()), @@ -2408,6 +2460,21 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {                                          FullName);  } +llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent, +                                        unsigned MType, SourceLocation LineLoc, +                                        StringRef Name, StringRef Value) { +  unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc); +  return DBuilder.createMacro(Parent, Line, MType, Name, Value); +} + +llvm::DIMacroFile *CGDebugInfo::CreateTempMacroFile(llvm::DIMacroFile *Parent, +                                                    SourceLocation LineLoc, +                                                    SourceLocation FileLoc) { +  llvm::DIFile *FName = getOrCreateFile(FileLoc); +  unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc); +  return DBuilder.createTempMacroFile(Parent, Line, FName); +} +  static QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) {    Qualifiers Quals;    do { @@ -2451,8 +2518,9 @@ static QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) {      case Type::SubstTemplateTypeParm:        T = cast<SubstTemplateTypeParmType>(T)->getReplacementType();        break; -    case Type::Auto: { -      QualType DT = cast<AutoType>(T)->getDeducedType(); +    case Type::Auto: +    case Type::DeducedTemplateSpecialization: { +      QualType DT = cast<DeducedType>(T)->getDeducedType();        assert(!DT.isNull() && "Undeduced types shouldn't reach here.");        T = DT;        break; @@ -2488,11 +2556,17 @@ void CGDebugInfo::completeTemplateDefinition(      const ClassTemplateSpecializationDecl &SD) {    if (DebugKind <= codegenoptions::DebugLineTablesOnly)      return; +  completeUnusedClass(SD); +} + +void CGDebugInfo::completeUnusedClass(const CXXRecordDecl &D) { +  if (DebugKind <= codegenoptions::DebugLineTablesOnly) +    return; -  completeClassData(&SD); +  completeClassData(&D);    // In case this type has no member function definitions being emitted, ensure    // it is retained -  RetainedTypes.push_back(CGM.getContext().getRecordType(&SD).getAsOpaquePtr()); +  RetainedTypes.push_back(CGM.getContext().getRecordType(&D).getAsOpaquePtr());  }  llvm::DIType *CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile *Unit) { @@ -2618,6 +2692,7 @@ llvm::DIType *CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile *Unit) {    case Type::Attributed:    case Type::Adjusted:    case Type::Decayed: +  case Type::DeducedTemplateSpecialization:    case Type::Elaborated:    case Type::Paren:    case Type::SubstTemplateTypeParm: @@ -2774,9 +2849,10 @@ void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit,    }    // No need to replicate the linkage name if it isn't different from the    // subprogram name, no need to have it at all unless coverage is enabled or -  // debug is set to more than just line tables. +  // debug is set to more than just line tables or extra debug info is needed.    if (LinkageName == Name || (!CGM.getCodeGenOpts().EmitGcovArcs &&                                !CGM.getCodeGenOpts().EmitGcovNotes && +                              !CGM.getCodeGenOpts().DebugInfoForProfiling &&                                DebugKind <= codegenoptions::DebugLineTablesOnly))      LinkageName = StringRef(); @@ -2844,28 +2920,40 @@ void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit,   VDContext = getContextDescriptor(cast<Decl>(DC), Mod ? Mod : TheCU);  } -llvm::DISubprogram * -CGDebugInfo::getFunctionForwardDeclaration(const FunctionDecl *FD) { +llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD, +                                                          bool Stub) {    llvm::DINodeArray TParamsArray;    StringRef Name, LinkageName;    llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero; -  SourceLocation Loc = FD->getLocation(); +  SourceLocation Loc = GD.getDecl()->getLocation();    llvm::DIFile *Unit = getOrCreateFile(Loc);    llvm::DIScope *DContext = Unit;    unsigned Line = getLineNumber(Loc); - -  collectFunctionDeclProps(FD, Unit, Name, LinkageName, DContext, +  collectFunctionDeclProps(GD, Unit, Name, LinkageName, DContext,                             TParamsArray, Flags); +  auto *FD = dyn_cast<FunctionDecl>(GD.getDecl()); +    // Build function type.    SmallVector<QualType, 16> ArgTypes; -  for (const ParmVarDecl *Parm: FD->parameters()) -    ArgTypes.push_back(Parm->getType()); +  if (FD) +    for (const ParmVarDecl *Parm : FD->parameters()) +      ArgTypes.push_back(Parm->getType());    CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv();    QualType FnType = CGM.getContext().getFunctionType(        FD->getReturnType(), ArgTypes, FunctionProtoType::ExtProtoInfo(CC)); +  if (Stub) { +    return DBuilder.createFunction( +        DContext, Name, LinkageName, Unit, Line, +        getOrCreateFunctionType(GD.getDecl(), FnType, Unit), +        !FD->isExternallyVisible(), +        /* isDefinition = */ true, 0, Flags, CGM.getLangOpts().Optimize, +        TParamsArray.get(), getFunctionDeclaration(FD)); +  } +    llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(        DContext, Name, LinkageName, Unit, Line, -      getOrCreateFunctionType(FD, FnType, Unit), !FD->isExternallyVisible(), +      getOrCreateFunctionType(GD.getDecl(), FnType, Unit), +      !FD->isExternallyVisible(),        /* isDefinition = */ false, 0, Flags, CGM.getLangOpts().Optimize,        TParamsArray.get(), getFunctionDeclaration(FD));    const auto *CanonDecl = cast<FunctionDecl>(FD->getCanonicalDecl()); @@ -2875,6 +2963,16 @@ CGDebugInfo::getFunctionForwardDeclaration(const FunctionDecl *FD) {    return SP;  } +llvm::DISubprogram * +CGDebugInfo::getFunctionForwardDeclaration(GlobalDecl GD) { +  return getFunctionFwdDeclOrStub(GD, /* Stub = */ false); +} + +llvm::DISubprogram * +CGDebugInfo::getFunctionStub(GlobalDecl GD) { +  return getFunctionFwdDeclOrStub(GD, /* Stub = */ true); +} +  llvm::DIGlobalVariable *  CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {    QualType T; @@ -3146,6 +3244,27 @@ void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc,        TParamsArray.get(), getFunctionDeclaration(D)));  } +void CGDebugInfo::EmitInlineFunctionStart(CGBuilderTy &Builder, GlobalDecl GD) { +  const auto *FD = cast<FunctionDecl>(GD.getDecl()); +  // If there is a subprogram for this function available then use it. +  auto FI = SPCache.find(FD->getCanonicalDecl()); +  llvm::DISubprogram *SP = nullptr; +  if (FI != SPCache.end()) +    SP = dyn_cast_or_null<llvm::DISubprogram>(FI->second); +  if (!SP) +    SP = getFunctionStub(GD); +  FnBeginRegionCount.push_back(LexicalBlockStack.size()); +  LexicalBlockStack.emplace_back(SP); +  setInlinedAt(Builder.getCurrentDebugLocation()); +  EmitLocation(Builder, FD->getLocation()); +} + +void CGDebugInfo::EmitInlineFunctionEnd(CGBuilderTy &Builder) { +  assert(CurInlinedAt && "unbalanced inline scope stack"); +  EmitFunctionEnd(Builder); +  setInlinedAt(llvm::DebugLoc(CurInlinedAt).getInlinedAt()); +} +  void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {    // Update our current location    setLocation(Loc); @@ -3155,7 +3274,7 @@ void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {    llvm::MDNode *Scope = LexicalBlockStack.back();    Builder.SetCurrentDebugLocation(llvm::DebugLoc::get( -      getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope)); +      getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope, CurInlinedAt));  }  void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { @@ -3167,14 +3286,29 @@ void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {        getColumnNumber(CurLoc)));  } +void CGDebugInfo::AppendAddressSpaceXDeref( +    unsigned AddressSpace, +    SmallVectorImpl<int64_t> &Expr) const { +  Optional<unsigned> DWARFAddressSpace = +      CGM.getTarget().getDWARFAddressSpace(AddressSpace); +  if (!DWARFAddressSpace) +    return; + +  Expr.push_back(llvm::dwarf::DW_OP_constu); +  Expr.push_back(DWARFAddressSpace.getValue()); +  Expr.push_back(llvm::dwarf::DW_OP_swap); +  Expr.push_back(llvm::dwarf::DW_OP_xderef); +} +  void CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder,                                          SourceLocation Loc) {    // Set our current location.    setLocation(Loc);    // Emit a line table change for the current location inside the new scope. -  Builder.SetCurrentDebugLocation(llvm::DebugLoc::get( -      getLineNumber(Loc), getColumnNumber(Loc), LexicalBlockStack.back())); +  Builder.SetCurrentDebugLocation( +      llvm::DebugLoc::get(getLineNumber(Loc), getColumnNumber(Loc), +                          LexicalBlockStack.back(), CurInlinedAt));    if (DebugKind <= codegenoptions::DebugLineTablesOnly)      return; @@ -3316,13 +3450,16 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::Value *Storage,      Line = getLineNumber(VD->getLocation());      Column = getColumnNumber(VD->getLocation());    } -  SmallVector<int64_t, 9> Expr; +  SmallVector<int64_t, 13> Expr;    llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;    if (VD->isImplicit())      Flags |= llvm::DINode::FlagArtificial;    auto Align = getDeclAlignIfRequired(VD, CGM.getContext()); +  unsigned AddressSpace = CGM.getContext().getTargetAddressSpace(VD->getType()); +  AppendAddressSpaceXDeref(AddressSpace, Expr); +    // If this is the first argument and it is implicit then    // give it an object pointer flag.    // FIXME: There has to be a better way to do this, but for static @@ -3360,9 +3497,10 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::Value *Storage,                                                    Line, Ty, Align);        // Insert an llvm.dbg.declare into the current block. -      DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), -                             llvm::DebugLoc::get(Line, Column, Scope), -                             Builder.GetInsertBlock()); +      DBuilder.insertDeclare( +          Storage, D, DBuilder.createExpression(Expr), +          llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt), +          Builder.GetInsertBlock());        return;      } else if (isa<VariableArrayType>(VD->getType()))        Expr.push_back(llvm::dwarf::DW_OP_deref); @@ -3393,9 +3531,10 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::Value *Storage,              Flags | llvm::DINode::FlagArtificial, FieldAlign);          // Insert an llvm.dbg.declare into the current block. -        DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), -                               llvm::DebugLoc::get(Line, Column, Scope), -                               Builder.GetInsertBlock()); +        DBuilder.insertDeclare( +            Storage, D, DBuilder.createExpression(Expr), +            llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt), +            Builder.GetInsertBlock());        }      }    } @@ -3411,7 +3550,7 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::Value *Storage,    // Insert an llvm.dbg.declare into the current block.    DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), -                         llvm::DebugLoc::get(Line, Column, Scope), +                         llvm::DebugLoc::get(Line, Column, Scope, CurInlinedAt),                           Builder.GetInsertBlock());  } @@ -3492,7 +3631,8 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(        Line, Ty, false, llvm::DINode::FlagZero, Align);    // Insert an llvm.dbg.declare into the current block. -  auto DL = llvm::DebugLoc::get(Line, Column, LexicalBlockStack.back()); +  auto DL = +      llvm::DebugLoc::get(Line, Column, LexicalBlockStack.back(), CurInlinedAt);    if (InsertPoint)      DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(addr), DL,                             InsertPoint); @@ -3660,12 +3800,13 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,      // Insert an llvm.dbg.value into the current block.      DBuilder.insertDbgValueIntrinsic(          LocalAddr, 0, debugVar, DBuilder.createExpression(), -        llvm::DebugLoc::get(line, column, scope), Builder.GetInsertBlock()); +        llvm::DebugLoc::get(line, column, scope, CurInlinedAt), +        Builder.GetInsertBlock());    }    // Insert an llvm.dbg.declare into the current block.    DBuilder.insertDeclare(Arg, debugVar, DBuilder.createExpression(), -                         llvm::DebugLoc::get(line, column, scope), +                         llvm::DebugLoc::get(line, column, scope, CurInlinedAt),                           Builder.GetInsertBlock());  } @@ -3747,9 +3888,16 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,      GVE = CollectAnonRecordDecls(RD, Unit, LineNo, LinkageName, Var, DContext);    } else {      auto Align = getDeclAlignIfRequired(D, CGM.getContext()); + +    SmallVector<int64_t, 4> Expr; +    unsigned AddressSpace = +        CGM.getContext().getTargetAddressSpace(D->getType()); +    AppendAddressSpaceXDeref(AddressSpace, Expr); +      GVE = DBuilder.createGlobalVariableExpression(          DContext, DeclName, LinkageName, Unit, LineNo, getOrCreateType(T, Unit), -        Var->hasLocalLinkage(), /*Expr=*/nullptr, +        Var->hasLocalLinkage(), +        Expr.empty() ? nullptr : DBuilder.createExpression(Expr),          getOrCreateStaticDataMemberDeclarationOrNull(D), Align);      Var->addDebugInfo(GVE);    }  | 
