r223803 - IR: Update clang for Metadata/Value split in r223802

Yaron Keren yaron.keren at gmail.com
Fri Dec 19 15:00:32 PST 2014


I suspect r223828 - DebugInfo: Accurate location information for complex
assignment‏, before it EmitStoreOfComplex was passing invalid
SourceLocation() into CGDebugInfo::EmitLocation which would return
immediately and the code path would not be exercised at all.

It's also possible r223828 just exposed some other hidden bug.

I won't have time for two builds to verify this today, if needed I'll build
first thing tommorrow.


2014-12-20 0:36 GMT+02:00 David Blaikie <dblaikie at gmail.com>:

>
>
> On Fri, Dec 19, 2014 at 2:21 PM, Yaron Keren <yaron.keren at gmail.com>
> wrote:
>>
>> I will look into creduce, looks like a very useful tool.
>>
>> The assert failing is not a clang assert but a Visual C++ header assert
>> (in debug mode only) checking empty std::vector every back() access to the
>> vector.
>> Maybe the libstdc++ std::vector runtime header does not have this assert
>> or it's not enabled?
>>
>> If I add an explicit assert for LexicalBlockStack:
>>
>> *  assert(LexicalBlockStack.size());*
>>   if (CurLoc == PrevLoc ||
>>       SM.getExpansionLoc(CurLoc) == SM.getExpansionLoc(PrevLoc))
>>     // New Builder may not be in sync with CGDebugInfo.
>>     if (!Builder.getCurrentDebugLocation().isUnknown() &&
>>         Builder.getCurrentDebugLocation().getScope(CGM.getLLVMContext())
>> ==
>>             LexicalBlockStack.back())
>>
>> it gets triggered with toT r224610:
>>
>>  Assertion failed: LexicalBlockStack.size(), file
>> ..\..\..\..\..\tools\clang\lib\CodeGen\CGDebugInfo.cpp, line 2648
>>
>> Could you try with this assert?
>>
>
> Yep, I can reproduce that, but don't know when it was introduced. Do you
> have a revision range for when you started seeing this?
>
>
>>
>>
>> 2014-12-19 23:49 GMT+02:00 Yaron Keren <yaron.keren at gmail.com>:
>>
>>> Thanks for checking so quickly, svn info shows r224610, I'll investigate
>>> what's going on.
>>>
>>>
>>> 2014-12-19 23:39 GMT+02:00 David Blaikie <dblaikie at gmail.com>:
>>>
>>>>
>>>>
>>>> On Fri, Dec 19, 2014 at 1:18 PM, Yaron Keren <yaron.keren at gmail.com>
>>>> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I have filed a C++ example triggering this.
>>>>>
>>>>
>>>> Is this triggering on ToT clang? My patch (not this one from Duncan)
>>>> r224385 was reverted in r224441.
>>>>
>>>>
>>>>> It's using boost... the source code is not long after preprocessed is
>>>>> almost 25MB.
>>>>>
>>>>
>>>> Just for future reference - the unpreprocessed source code length isn't
>>>> usually terribly important (so if you can't reduce the preprocessed source,
>>>> it's probably not too important to spend time reducing the unpreprocessed
>>>> source - you'll only be removing maybe a few hundred lines, out of the many
>>>> thousands that need to be reduced). Tools like creduce can help reduce the
>>>> preprocessed source without so much manual effort.
>>>>
>>>> In any case, I can't seem to reproduce the assertion failure from your
>>>> preprocessed file, nor from Francois example... (even with my patch
>>>> reapplied)...
>>>>
>>>> - David
>>>>
>>>>
>>>>>
>>>>>  http://llvm.org/PR21987
>>>>>
>>>>> Yaron
>>>>>
>>>>>
>>>>> 2014-12-17 22:21 GMT+02:00 David Blaikie <dblaikie at gmail.com>:
>>>>>
>>>>>> Yeah, still sounds likely that that was my change, not this one.
>>>>>>
>>>>>> On Wed, Dec 17, 2014 at 12:19 PM, Duncan P. N. Exon Smith <
>>>>>> dexonsmith at apple.com> wrote:
>>>>>>>
>>>>>>> So r223803 (and r223802) should have been effectively NFC (at least
>>>>>>> once
>>>>>>> the follow-up bugfixes were applied).
>>>>>>>
>>>>>>> I didn't change the logic around LexicalBlockStack -- just changed
>>>>>>> some
>>>>>>> `push_back`s to `emplace_back`s because I changed the type being
>>>>>>> held in
>>>>>>> it -- and I honestly don't know how it's supposed to work.  (And I
>>>>>>> don't
>>>>>>> know anything about ABIs.)
>>>>>>>
>>>>>>> If I'm going to help you debug this, I'll need some more guidance.
>>>>>>> Ideally, you'd give me a patch and a reproduction to expose the
>>>>>>> problem
>>>>>>> on ToT.  (Or maybe David has some ideas?)
>>>>>>>
>>>>>>> (BTW, have you done a bisection?  Are you sure this is the
>>>>>>> problematic
>>>>>>> commit?)
>>>>>>>
>>>>>>> > On 2014-Dec-17, at 08:43, Francois Pichet <pichet2000 at gmail.com>
>>>>>>> wrote:
>>>>>>> >
>>>>>>> > Hi, the assert will occur for a target that use DefaultABIInfo
>>>>>>> where Complex types are returned via the ABIArgInfo::Indirect mechanism.
>>>>>>> This is the case for my out of tree target.
>>>>>>> >
>>>>>>> > EmitFunctionEnd will make LexicalBlockStack empty.
>>>>>>> > EmitStoreOfComplex called from EmitFunctionEpilog will eventually
>>>>>>> assume a non empty LexicalBlockStack.
>>>>>>> >
>>>>>>> > On Tue, Dec 16, 2014 at 6:15 PM, Duncan P. N. Exon Smith <
>>>>>>> dexonsmith at apple.com> wrote:
>>>>>>> > It's not reproducing for me:
>>>>>>> >
>>>>>>> > clang -g test.c
>>>>>>> > test.c:3:8: warning: implicitly declaring library function 'casin'
>>>>>>> with type '_Complex double
>>>>>>> >       (_Complex double)'
>>>>>>> >    z = casin(z);
>>>>>>> >        ^
>>>>>>> > test.c:3:8: note: include the header <complex.h> or explicitly
>>>>>>> provide a declaration for 'casin'
>>>>>>> > 1 warning generated.
>>>>>>> > Undefined symbols for architecture x86_64:
>>>>>>> >   "_main", referenced from:
>>>>>>> >      implicit entry/start for main executable
>>>>>>> > ld: symbol(s) not found for architecture x86_64
>>>>>>> > clang-3.6: error: linker command failed with exit code 1 (use -v
>>>>>>> to see invocation)
>>>>>>> > lrun: error: failed:
>>>>>>> /Users/dexonsmith/data/llvm.debug/debug-info/bin/clang -g test.c
>>>>>>> >
>>>>>>> > If you can reproduce this ToT, please file a PR with preprocessed
>>>>>>> source and
>>>>>>> > the -cc1 command (usually the driver will produce these files for
>>>>>>> you) and
>>>>>>> > CC me.
>>>>>>> >
>>>>>>> > > On 2014 Dec 16, at 12:24, Francois Pichet <pichet2000 at gmail.com>
>>>>>>> wrote:
>>>>>>> > >
>>>>>>> > > Hi, I re-synced a private repo of clang/llvm lately and I am
>>>>>>> getting an assert when compiling musl-libc with clang in debug mode, I
>>>>>>> suspect this commit. Basically LexicalBlockStack is empty when
>>>>>>> CGDebugInfo::EmitLocation is called.
>>>>>>> > >
>>>>>>> > > clang -g test.c
>>>>>>> > >
>>>>>>> > > here is the test.c: http://pastebin.com/zXyAknCf
>>>>>>> > >
>>>>>>> > > Thanks,
>>>>>>> > >
>>>>>>> > > On Tue, Dec 9, 2014 at 1:39 PM, Duncan P. N. Exon Smith <
>>>>>>> dexonsmith at apple.com> wrote:
>>>>>>> > > Author: dexonsmith
>>>>>>> > > Date: Tue Dec  9 12:39:32 2014
>>>>>>> > > New Revision: 223803
>>>>>>> > >
>>>>>>> > > URL: http://llvm.org/viewvc/llvm-project?rev=223803&view=rev
>>>>>>> > > Log:
>>>>>>> > > IR: Update clang for Metadata/Value split in r223802
>>>>>>> > >
>>>>>>> > > Match LLVM API changes from r223802.
>>>>>>> > >
>>>>>>> > > Modified:
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGDebugInfo.h
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGExpr.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGLoopInfo.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGObjC.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CGStmt.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/CodeGenModule.h
>>>>>>> > >     cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp
>>>>>>> > >     cfe/trunk/lib/CodeGen/TargetInfo.cpp
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -5932,8 +5932,8 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>>>>>>> > >    case X86::BI__builtin_ia32_movntdq256:
>>>>>>> > >    case X86::BI__builtin_ia32_movnti:
>>>>>>> > >    case X86::BI__builtin_ia32_movnti64: {
>>>>>>> > > -    llvm::MDNode *Node = llvm::MDNode::get(getLLVMContext(),
>>>>>>> > > -                                           Builder.getInt32(1));
>>>>>>> > > +    llvm::MDNode *Node = llvm::MDNode::get(
>>>>>>> > > +        getLLVMContext(),
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
>>>>>>> > >
>>>>>>> > >      // Convert the type of the pointer to a pointer to the
>>>>>>> stored type.
>>>>>>> > >      Value *BC = Builder.CreateBitCast(Ops[0],
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Tue Dec  9 12:39:32
>>>>>>> 2014
>>>>>>> > > @@ -126,13 +126,13 @@ void CGDebugInfo::setLocation(SourceLoca
>>>>>>> > >          LBF.getScope(), getOrCreateFile(CurLoc));
>>>>>>> > >      llvm::MDNode *N = D;
>>>>>>> > >      LexicalBlockStack.pop_back();
>>>>>>> > > -    LexicalBlockStack.push_back(N);
>>>>>>> > > +    LexicalBlockStack.emplace_back(N);
>>>>>>> > >    } else if (Scope.isLexicalBlock() || Scope.isSubprogram()) {
>>>>>>> > >      llvm::DIDescriptor D =
>>>>>>> > >          DBuilder.createLexicalBlockFile(Scope,
>>>>>>> getOrCreateFile(CurLoc));
>>>>>>> > >      llvm::MDNode *N = D;
>>>>>>> > >      LexicalBlockStack.pop_back();
>>>>>>> > > -    LexicalBlockStack.push_back(N);
>>>>>>> > > +    LexicalBlockStack.emplace_back(N);
>>>>>>> > >    }
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -141,10 +141,9 @@ llvm::DIScope CGDebugInfo::getContextDes
>>>>>>> > >    if (!Context)
>>>>>>> > >      return TheCU;
>>>>>>> > >
>>>>>>> > > -  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I =
>>>>>>> > > -      RegionMap.find(Context);
>>>>>>> > > +  auto I = RegionMap.find(Context);
>>>>>>> > >    if (I != RegionMap.end()) {
>>>>>>> > > -    llvm::Value *V = I->second;
>>>>>>> > > +    llvm::Metadata *V = I->second;
>>>>>>> > >      return llvm::DIScope(dyn_cast_or_null<llvm::MDNode>(V));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > @@ -256,18 +255,17 @@ llvm::DIFile CGDebugInfo::getOrCreateFil
>>>>>>> > >
>>>>>>> > >    // Cache the results.
>>>>>>> > >    const char *fname = PLoc.getFilename();
>>>>>>> > > -  llvm::DenseMap<const char *, llvm::WeakVH>::iterator it =
>>>>>>> > > -      DIFileCache.find(fname);
>>>>>>> > > +  auto it = DIFileCache.find(fname);
>>>>>>> > >
>>>>>>> > >    if (it != DIFileCache.end()) {
>>>>>>> > >      // Verify that the information still exists.
>>>>>>> > > -    if (llvm::Value *V = it->second)
>>>>>>> > > +    if (llvm::Metadata *V = it->second)
>>>>>>> > >        return llvm::DIFile(cast<llvm::MDNode>(V));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    llvm::DIFile F = DBuilder.createFile(PLoc.getFilename(),
>>>>>>> getCurrentDirname());
>>>>>>> > >
>>>>>>> > > -  DIFileCache[fname] = F;
>>>>>>> > > +  DIFileCache[fname].reset(F);
>>>>>>> > >    return F;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -641,7 +639,9 @@ CGDebugInfo::getOrCreateRecordFwdDecl(co
>>>>>>> > >    SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM,
>>>>>>> TheCU);
>>>>>>> > >    llvm::DICompositeType RetTy =
>>>>>>> DBuilder.createReplaceableForwardDecl(
>>>>>>> > >        Tag, RDName, Ctx, DefUnit, Line, 0, 0, 0, FullName);
>>>>>>> > > -  ReplaceMap.push_back(std::make_pair(Ty,
>>>>>>> static_cast<llvm::Value *>(RetTy)));
>>>>>>> > > +  ReplaceMap.emplace_back(
>>>>>>> > > +      std::piecewise_construct, std::make_tuple(Ty),
>>>>>>> > > +      std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
>>>>>>> > >    return RetTy;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -680,7 +680,7 @@ llvm::DIType CGDebugInfo::CreateType(con
>>>>>>> > >    if (BlockLiteralGeneric)
>>>>>>> > >      return BlockLiteralGeneric;
>>>>>>> > >
>>>>>>> > > -  SmallVector<llvm::Value *, 8> EltTys;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> EltTys;
>>>>>>> > >    llvm::DIType FieldTy;
>>>>>>> > >    QualType FType;
>>>>>>> > >    uint64_t FieldSize, FieldOffset;
>>>>>>> > > @@ -784,7 +784,7 @@ llvm::DIType CGDebugInfo::CreateType(con
>>>>>>> > >
>>>>>>> > >  llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty,
>>>>>>> > >                                       llvm::DIFile Unit) {
>>>>>>> > > -  SmallVector<llvm::Value *, 16> EltTys;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> EltTys;
>>>>>>> > >
>>>>>>> > >    // Add the result type at least.
>>>>>>> > >    EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit));
>>>>>>> > > @@ -857,10 +857,9 @@ llvm::DIType CGDebugInfo::createFieldTyp
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  /// CollectRecordLambdaFields - Helper for CollectRecordFields.
>>>>>>> > > -void
>>>>>>> > > -CGDebugInfo::CollectRecordLambdaFields(const CXXRecordDecl
>>>>>>> *CXXDecl,
>>>>>>> > > -
>>>>>>>  SmallVectorImpl<llvm::Value *> &elements,
>>>>>>> > > -                                       llvm::DIType RecordTy) {
>>>>>>> > > +void CGDebugInfo::CollectRecordLambdaFields(
>>>>>>> > > +    const CXXRecordDecl *CXXDecl,
>>>>>>> SmallVectorImpl<llvm::Metadata *> &elements,
>>>>>>> > > +    llvm::DIType RecordTy) {
>>>>>>> > >    // For C++11 Lambdas a Field will be the same as a Capture,
>>>>>>> but the Capture
>>>>>>> > >    // has the name and the location of the variable so we should
>>>>>>> iterate over
>>>>>>> > >    // both concurrently.
>>>>>>> > > @@ -928,14 +927,14 @@ llvm::DIDerivedType CGDebugInfo::CreateR
>>>>>>> > >    unsigned Flags = getAccessFlag(Var->getAccess(), RD);
>>>>>>> > >    llvm::DIDerivedType GV = DBuilder.createStaticMemberType(
>>>>>>> > >        RecordTy, VName, VUnit, LineNumber, VTy, Flags, C);
>>>>>>> > > -  StaticDataMemberCache[Var->getCanonicalDecl()] =
>>>>>>> llvm::WeakVH(GV);
>>>>>>> > > +  StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV);
>>>>>>> > >    return GV;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  /// CollectRecordNormalField - Helper for CollectRecordFields.
>>>>>>> > >  void CGDebugInfo::CollectRecordNormalField(
>>>>>>> > >      const FieldDecl *field, uint64_t OffsetInBits, llvm::DIFile
>>>>>>> tunit,
>>>>>>> > > -    SmallVectorImpl<llvm::Value *> &elements, llvm::DIType
>>>>>>> RecordTy,
>>>>>>> > > +    SmallVectorImpl<llvm::Metadata *> &elements, llvm::DIType
>>>>>>> RecordTy,
>>>>>>> > >      const RecordDecl *RD) {
>>>>>>> > >    StringRef name = field->getName();
>>>>>>> > >    QualType type = field->getType();
>>>>>>> > > @@ -959,10 +958,10 @@ void CGDebugInfo::CollectRecordNormalFie
>>>>>>> > >
>>>>>>> > >  /// CollectRecordFields - A helper function to collect debug
>>>>>>> info for
>>>>>>> > >  /// record fields. This is used while creating debug info entry
>>>>>>> for a Record.
>>>>>>> > > -void CGDebugInfo::CollectRecordFields(const RecordDecl *record,
>>>>>>> > > -                                      llvm::DIFile tunit,
>>>>>>> > > -
>>>>>>> SmallVectorImpl<llvm::Value *> &elements,
>>>>>>> > > -                                      llvm::DICompositeType
>>>>>>> RecordTy) {
>>>>>>> > > +void CGDebugInfo::CollectRecordFields(
>>>>>>> > > +    const RecordDecl *record, llvm::DIFile tunit,
>>>>>>> > > +    SmallVectorImpl<llvm::Metadata *> &elements,
>>>>>>> > > +    llvm::DICompositeType RecordTy) {
>>>>>>> > >    const CXXRecordDecl *CXXDecl =
>>>>>>> dyn_cast<CXXRecordDecl>(record);
>>>>>>> > >
>>>>>>> > >    if (CXXDecl && CXXDecl->isLambda())
>>>>>>> > > @@ -978,8 +977,7 @@ void CGDebugInfo::CollectRecordFields(co
>>>>>>> > >      for (const auto *I : record->decls())
>>>>>>> > >        if (const auto *V = dyn_cast<VarDecl>(I)) {
>>>>>>> > >          // Reuse the existing static member declaration if one
>>>>>>> exists
>>>>>>> > > -        llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI
>>>>>>> =
>>>>>>> > > -            StaticDataMemberCache.find(V->getCanonicalDecl());
>>>>>>> > > +        auto MI =
>>>>>>> StaticDataMemberCache.find(V->getCanonicalDecl());
>>>>>>> > >          if (MI != StaticDataMemberCache.end()) {
>>>>>>> > >            assert(MI->second &&
>>>>>>> > >                   "Static data member declaration should still
>>>>>>> exist");
>>>>>>> > > @@ -1019,7 +1017,7 @@ llvm::DICompositeType CGDebugInfo::getOr
>>>>>>> > >        getOrCreateType(QualType(Func, 0), Unit)).getTypeArray();
>>>>>>> > >    assert(Args.getNumElements() && "Invalid number of
>>>>>>> arguments!");
>>>>>>> > >
>>>>>>> > > -  SmallVector<llvm::Value *, 16> Elts;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> Elts;
>>>>>>> > >
>>>>>>> > >    // First element is always return type. For 'void' functions
>>>>>>> it is NULL.
>>>>>>> > >    Elts.push_back(Args.getElement(0));
>>>>>>> > > @@ -1036,7 +1034,7 @@ llvm::DICompositeType CGDebugInfo::getOr
>>>>>>> > >      llvm::DIType PointeeType = getOrCreateType(PointeeTy, Unit);
>>>>>>> > >      llvm::DIType ThisPtrType =
>>>>>>> > >          DBuilder.createPointerType(PointeeType, Size, Align);
>>>>>>> > > -    TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType;
>>>>>>> > > +    TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType);
>>>>>>> > >      // TODO: This and the artificial type below are misleading,
>>>>>>> the
>>>>>>> > >      // types aren't artificial the argument is, but the current
>>>>>>> > >      // metadata doesn't represent that.
>>>>>>> > > @@ -1044,7 +1042,7 @@ llvm::DICompositeType CGDebugInfo::getOr
>>>>>>> > >      Elts.push_back(ThisPtrType);
>>>>>>> > >    } else {
>>>>>>> > >      llvm::DIType ThisPtrType = getOrCreateType(ThisPtr, Unit);
>>>>>>> > > -    TypeCache[ThisPtr.getAsOpaquePtr()] = ThisPtrType;
>>>>>>> > > +    TypeCache[ThisPtr.getAsOpaquePtr()].reset(ThisPtrType);
>>>>>>> > >      ThisPtrType = DBuilder.createObjectPointerType(ThisPtrType);
>>>>>>> > >      Elts.push_back(ThisPtrType);
>>>>>>> > >    }
>>>>>>> > > @@ -1147,7 +1145,7 @@ CGDebugInfo::CreateCXXMemberFunction(con
>>>>>>> > >        /* isDefinition=*/false, Virtuality, VIndex,
>>>>>>> ContainingType, Flags,
>>>>>>> > >        CGM.getLangOpts().Optimize, nullptr, TParamsArray);
>>>>>>> > >
>>>>>>> > > -  SPCache[Method->getCanonicalDecl()] = llvm::WeakVH(SP);
>>>>>>> > > +  SPCache[Method->getCanonicalDecl()].reset(SP);
>>>>>>> > >
>>>>>>> > >    return SP;
>>>>>>> > >  }
>>>>>>> > > @@ -1157,7 +1155,7 @@ CGDebugInfo::CreateCXXMemberFunction(con
>>>>>>> > >  /// a Record.
>>>>>>> > >  void CGDebugInfo::CollectCXXMemberFunctions(
>>>>>>> > >      const CXXRecordDecl *RD, llvm::DIFile Unit,
>>>>>>> > > -    SmallVectorImpl<llvm::Value *> &EltTys, llvm::DIType
>>>>>>> RecordTy) {
>>>>>>> > > +    SmallVectorImpl<llvm::Metadata *> &EltTys, llvm::DIType
>>>>>>> RecordTy) {
>>>>>>> > >
>>>>>>> > >    // Since we want more than just the individual member decls
>>>>>>> if we
>>>>>>> > >    // have templated functions iterate over every declaration to
>>>>>>> gather
>>>>>>> > > @@ -1188,7 +1186,7 @@ void CGDebugInfo::CollectCXXMemberFuncti
>>>>>>> > >      auto MI = SPCache.find(Method->getCanonicalDecl());
>>>>>>> > >      EltTys.push_back(MI == SPCache.end()
>>>>>>> > >                           ? CreateCXXMemberFunction(Method,
>>>>>>> Unit, RecordTy)
>>>>>>> > > -                         : static_cast<llvm::Value
>>>>>>> *>(MI->second));
>>>>>>> > > +                         : static_cast<llvm::Metadata
>>>>>>> *>(MI->second));
>>>>>>> > >    }
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -1196,7 +1194,7 @@ void CGDebugInfo::CollectCXXMemberFuncti
>>>>>>> > >  /// C++ base classes. This is used while creating debug info
>>>>>>> entry for
>>>>>>> > >  /// a Record.
>>>>>>> > >  void CGDebugInfo::CollectCXXBases(const CXXRecordDecl *RD,
>>>>>>> llvm::DIFile Unit,
>>>>>>> > > -                                  SmallVectorImpl<llvm::Value
>>>>>>> *> &EltTys,
>>>>>>> > > +
>>>>>>> SmallVectorImpl<llvm::Metadata *> &EltTys,
>>>>>>> > >                                    llvm::DIType RecordTy) {
>>>>>>> > >
>>>>>>> > >    const ASTRecordLayout &RL =
>>>>>>> CGM.getContext().getASTRecordLayout(RD);
>>>>>>> > > @@ -1238,7 +1236,7 @@ llvm::DIArray
>>>>>>> > >  CGDebugInfo::CollectTemplateParams(const TemplateParameterList
>>>>>>> *TPList,
>>>>>>> > >                                     ArrayRef<TemplateArgument>
>>>>>>> TAList,
>>>>>>> > >                                     llvm::DIFile Unit) {
>>>>>>> > > -  SmallVector<llvm::Value *, 16> TemplateParams;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> TemplateParams;
>>>>>>> > >    for (unsigned i = 0, e = TAList.size(); i != e; ++i) {
>>>>>>> > >      const TemplateArgument &TA = TAList[i];
>>>>>>> > >      StringRef Name;
>>>>>>> > > @@ -1263,7 +1261,7 @@ CGDebugInfo::CollectTemplateParams(const
>>>>>>> > >        const ValueDecl *D = TA.getAsDecl();
>>>>>>> > >        QualType T =
>>>>>>> TA.getParamTypeForDecl().getDesugaredType(CGM.getContext());
>>>>>>> > >        llvm::DIType TTy = getOrCreateType(T, Unit);
>>>>>>> > > -      llvm::Value *V = nullptr;
>>>>>>> > > +      llvm::Constant *V = nullptr;
>>>>>>> > >        const CXXMethodDecl *MD;
>>>>>>> > >        // Variable pointer template parameters have a value that
>>>>>>> is the address
>>>>>>> > >        // of the variable.
>>>>>>> > > @@ -1295,7 +1293,7 @@ CGDebugInfo::CollectTemplateParams(const
>>>>>>> > >      case TemplateArgument::NullPtr: {
>>>>>>> > >        QualType T = TA.getNullPtrType();
>>>>>>> > >        llvm::DIType TTy = getOrCreateType(T, Unit);
>>>>>>> > > -      llvm::Value *V = nullptr;
>>>>>>> > > +      llvm::Constant *V = nullptr;
>>>>>>> > >        // Special case member data pointer null values since
>>>>>>> they're actually -1
>>>>>>> > >        // instead of zero.
>>>>>>> > >        if (const MemberPointerType *MPT =
>>>>>>> > > @@ -1332,7 +1330,7 @@ CGDebugInfo::CollectTemplateParams(const
>>>>>>> > >        QualType T = E->getType();
>>>>>>> > >        if (E->isGLValue())
>>>>>>> > >          T = CGM.getContext().getLValueReferenceType(T);
>>>>>>> > > -      llvm::Value *V = CGM.EmitConstantExpr(E, T);
>>>>>>> > > +      llvm::Constant *V = CGM.EmitConstantExpr(E, T);
>>>>>>> > >        assert(V && "Expression in template argument isn't
>>>>>>> constant");
>>>>>>> > >        llvm::DIType TTy = getOrCreateType(T, Unit);
>>>>>>> > >        llvm::DITemplateValueParameter TVP =
>>>>>>> > > @@ -1385,7 +1383,7 @@ llvm::DIType CGDebugInfo::getOrCreateVTa
>>>>>>> > >    ASTContext &Context = CGM.getContext();
>>>>>>> > >
>>>>>>> > >    /* Function type */
>>>>>>> > > -  llvm::Value *STy = getOrCreateType(Context.IntTy, Unit);
>>>>>>> > > +  llvm::Metadata *STy = getOrCreateType(Context.IntTy, Unit);
>>>>>>> > >    llvm::DITypeArray SElements =
>>>>>>> DBuilder.getOrCreateTypeArray(STy);
>>>>>>> > >    llvm::DIType SubTy = DBuilder.createSubroutineType(Unit,
>>>>>>> SElements);
>>>>>>> > >    unsigned Size = Context.getTypeSize(Context.VoidPtrTy);
>>>>>>> > > @@ -1404,7 +1402,7 @@ StringRef CGDebugInfo::getVTableName(con
>>>>>>> > >  /// CollectVTableInfo - If the C++ class has vtable info then
>>>>>>> insert appropriate
>>>>>>> > >  /// debug info entry in EltTys vector.
>>>>>>> > >  void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD,
>>>>>>> llvm::DIFile Unit,
>>>>>>> > > -                                    SmallVectorImpl<llvm::Value
>>>>>>> *> &EltTys) {
>>>>>>> > > +
>>>>>>> SmallVectorImpl<llvm::Metadata *> &EltTys) {
>>>>>>> > >    const ASTRecordLayout &RL =
>>>>>>> CGM.getContext().getASTRecordLayout(RD);
>>>>>>> > >
>>>>>>> > >    // If there is a primary base then it will hold vtable info.
>>>>>>> > > @@ -1447,12 +1445,11 @@ void CGDebugInfo::completeType(const Enu
>>>>>>> > >    void *TyPtr = Ty.getAsOpaquePtr();
>>>>>>> > >    auto I = TypeCache.find(TyPtr);
>>>>>>> > >    if (I == TypeCache.end() ||
>>>>>>> > > -      !llvm::DIType(cast<llvm::MDNode>(static_cast<llvm::Value
>>>>>>> *>(I->second)))
>>>>>>> > > -           .isForwardDecl())
>>>>>>> > > +
>>>>>>> !llvm::DIType(cast<llvm::MDNode>(I->second)).isForwardDecl())
>>>>>>> > >      return;
>>>>>>> > >    llvm::DIType Res =
>>>>>>> CreateTypeDefinition(Ty->castAs<EnumType>());
>>>>>>> > >    assert(!Res.isForwardDecl());
>>>>>>> > > -  TypeCache[TyPtr] = Res;
>>>>>>> > > +  TypeCache[TyPtr].reset(Res);
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  void CGDebugInfo::completeType(const RecordDecl *RD) {
>>>>>>> > > @@ -1482,12 +1479,11 @@ void CGDebugInfo::completeClassData(cons
>>>>>>> > >    void *TyPtr = Ty.getAsOpaquePtr();
>>>>>>> > >    auto I = TypeCache.find(TyPtr);
>>>>>>> > >    if (I != TypeCache.end() &&
>>>>>>> > > -      !llvm::DIType(cast<llvm::MDNode>(static_cast<llvm::Value
>>>>>>> *>(I->second)))
>>>>>>> > > -           .isForwardDecl())
>>>>>>> > > +
>>>>>>> !llvm::DIType(cast<llvm::MDNode>(I->second)).isForwardDecl())
>>>>>>> > >      return;
>>>>>>> > >    llvm::DIType Res =
>>>>>>> CreateTypeDefinition(Ty->castAs<RecordType>());
>>>>>>> > >    assert(!Res.isForwardDecl());
>>>>>>> > > -  TypeCache[TyPtr] = Res;
>>>>>>> > > +  TypeCache[TyPtr].reset(Res);
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  static bool
>>>>>>> hasExplicitMemberDefinition(CXXRecordDecl::method_iterator I,
>>>>>>> > > @@ -1571,11 +1567,11 @@ llvm::DIType CGDebugInfo::CreateTypeDefi
>>>>>>> > >      CollectContainingType(CXXDecl, FwdDecl);
>>>>>>> > >
>>>>>>> > >    // Push the struct on region stack.
>>>>>>> > > -  LexicalBlockStack.push_back(&*FwdDecl);
>>>>>>> > > -  RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl);
>>>>>>> > > +  LexicalBlockStack.emplace_back(&*FwdDecl);
>>>>>>> > > +  RegionMap[Ty->getDecl()].reset(FwdDecl);
>>>>>>> > >
>>>>>>> > >    // Convert all the elements.
>>>>>>> > > -  SmallVector<llvm::Value *, 16> EltTys;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> EltTys;
>>>>>>> > >    // what about nested types?
>>>>>>> > >
>>>>>>> > >    // Note: The split of CXXDecl information here is
>>>>>>> intentional, the
>>>>>>> > > @@ -1599,7 +1595,7 @@ llvm::DIType CGDebugInfo::CreateTypeDefi
>>>>>>> > >    llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys);
>>>>>>> > >    FwdDecl.setArrays(Elements);
>>>>>>> > >
>>>>>>> > > -  RegionMap[Ty->getDecl()] = llvm::WeakVH(FwdDecl);
>>>>>>> > > +  RegionMap[Ty->getDecl()].reset(FwdDecl);
>>>>>>> > >    return FwdDecl;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -1680,14 +1676,14 @@ llvm::DIType CGDebugInfo::CreateTypeDefi
>>>>>>> > >        llvm::DIArray(), RuntimeLang);
>>>>>>> > >
>>>>>>> > >    QualType QTy(Ty, 0);
>>>>>>> > > -  TypeCache[QTy.getAsOpaquePtr()] = RealDecl;
>>>>>>> > > +  TypeCache[QTy.getAsOpaquePtr()].reset(RealDecl);
>>>>>>> > >
>>>>>>> > >    // Push the struct on region stack.
>>>>>>> > > -  LexicalBlockStack.push_back(static_cast<llvm::MDNode
>>>>>>> *>(RealDecl));
>>>>>>> > > -  RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl);
>>>>>>> > > +  LexicalBlockStack.emplace_back(static_cast<llvm::MDNode
>>>>>>> *>(RealDecl));
>>>>>>> > > +  RegionMap[Ty->getDecl()].reset(RealDecl);
>>>>>>> > >
>>>>>>> > >    // Convert all the elements.
>>>>>>> > > -  SmallVector<llvm::Value *, 16> EltTys;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> EltTys;
>>>>>>> > >
>>>>>>> > >    ObjCInterfaceDecl *SClass = ID->getSuperClass();
>>>>>>> > >    if (SClass) {
>>>>>>> > > @@ -1813,7 +1809,7 @@ llvm::DIType CGDebugInfo::CreateType(con
>>>>>>> > >      // Use Count == -1 to express such arrays.
>>>>>>> > >      Count = -1;
>>>>>>> > >
>>>>>>> > > -  llvm::Value *Subscript = DBuilder.getOrCreateSubrange(0,
>>>>>>> Count);
>>>>>>> > > +  llvm::Metadata *Subscript = DBuilder.getOrCreateSubrange(0,
>>>>>>> Count);
>>>>>>> > >    llvm::DIArray SubscriptArray =
>>>>>>> DBuilder.getOrCreateArray(Subscript);
>>>>>>> > >
>>>>>>> > >    uint64_t Size = CGM.getContext().getTypeSize(Ty);
>>>>>>> > > @@ -1849,7 +1845,7 @@ llvm::DIType CGDebugInfo::CreateType(con
>>>>>>> > >    // Add the dimensions of the array.  FIXME: This loses CV
>>>>>>> qualifiers from
>>>>>>> > >    // interior arrays, do we care?  Why aren't nested arrays
>>>>>>> represented the
>>>>>>> > >    // obvious/recursive way?
>>>>>>> > > -  SmallVector<llvm::Value *, 8> Subscripts;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> Subscripts;
>>>>>>> > >    QualType EltTy(Ty, 0);
>>>>>>> > >    while ((Ty = dyn_cast<ArrayType>(EltTy))) {
>>>>>>> > >      // If the number of elements is known, then count is that
>>>>>>> number. Otherwise,
>>>>>>> > > @@ -1932,7 +1928,9 @@ llvm::DIType CGDebugInfo::CreateEnumType
>>>>>>> > >      llvm::DIType RetTy = DBuilder.createReplaceableForwardDecl(
>>>>>>> > >          llvm::dwarf::DW_TAG_enumeration_type, EDName,
>>>>>>> EDContext, DefUnit, Line,
>>>>>>> > >          0, Size, Align, FullName);
>>>>>>> > > -    ReplaceMap.push_back(std::make_pair(Ty,
>>>>>>> static_cast<llvm::Value *>(RetTy)));
>>>>>>> > > +    ReplaceMap.emplace_back(
>>>>>>> > > +        std::piecewise_construct, std::make_tuple(Ty),
>>>>>>> > > +        std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
>>>>>>> > >      return RetTy;
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > @@ -1951,7 +1949,7 @@ llvm::DIType CGDebugInfo::CreateTypeDefi
>>>>>>> > >    SmallString<256> FullName = getUniqueTagTypeName(Ty, CGM,
>>>>>>> TheCU);
>>>>>>> > >
>>>>>>> > >    // Create DIEnumerator elements for each enumerator.
>>>>>>> > > -  SmallVector<llvm::Value *, 16> Enumerators;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> Enumerators;
>>>>>>> > >    ED = ED->getDefinition();
>>>>>>> > >    for (const auto *Enum : ED->enumerators()) {
>>>>>>> > >      Enumerators.push_back(DBuilder.createEnumerator(
>>>>>>> > > @@ -2039,7 +2037,7 @@ llvm::DIType CGDebugInfo::getTypeOrNull(
>>>>>>> > >    auto it = TypeCache.find(Ty.getAsOpaquePtr());
>>>>>>> > >    if (it != TypeCache.end()) {
>>>>>>> > >      // Verify that the debug info still exists.
>>>>>>> > > -    if (llvm::Value *V = it->second)
>>>>>>> > > +    if (llvm::Metadata *V = it->second)
>>>>>>> > >        return llvm::DIType(cast<llvm::MDNode>(V));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > @@ -2074,7 +2072,7 @@ llvm::DIType CGDebugInfo::getOrCreateTyp
>>>>>>> > >    void *TyPtr = Ty.getAsOpaquePtr();
>>>>>>> > >
>>>>>>> > >    // And update the type cache.
>>>>>>> > > -  TypeCache[TyPtr] = Res;
>>>>>>> > > +  TypeCache[TyPtr].reset(Res);
>>>>>>> > >
>>>>>>> > >    return Res;
>>>>>>> > >  }
>>>>>>> > > @@ -2209,7 +2207,7 @@ llvm::DIType CGDebugInfo::getOrCreateLim
>>>>>>> > >    Res.setArrays(T.getElements());
>>>>>>> > >
>>>>>>> > >    // And update the type cache.
>>>>>>> > > -  TypeCache[QTy.getAsOpaquePtr()] = Res;
>>>>>>> > > +  TypeCache[QTy.getAsOpaquePtr()].reset(Res);
>>>>>>> > >    return Res;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -2257,8 +2255,8 @@ llvm::DICompositeType CGDebugInfo::Creat
>>>>>>> > >          RDContext, RDName, DefUnit, Line, Size, Align, 0,
>>>>>>> llvm::DIType(),
>>>>>>> > >          llvm::DIArray(), 0, llvm::DIType(), FullName);
>>>>>>> > >
>>>>>>> > > -  RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl);
>>>>>>> > > -  TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl;
>>>>>>> > > +  RegionMap[Ty->getDecl()].reset(RealDecl);
>>>>>>> > > +  TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
>>>>>>> > >
>>>>>>> > >    if (const ClassTemplateSpecializationDecl *TSpecial =
>>>>>>> > >            dyn_cast<ClassTemplateSpecializationDecl>(RD))
>>>>>>> > > @@ -2401,8 +2399,9 @@ CGDebugInfo::getFunctionForwardDeclarati
>>>>>>> > >
>>>>>>>  CGM.getLangOpts().Optimize, nullptr,
>>>>>>> > >                                         TParamsArray,
>>>>>>> getFunctionDeclaration(FD));
>>>>>>> > >    const FunctionDecl *CanonDecl =
>>>>>>> cast<FunctionDecl>(FD->getCanonicalDecl());
>>>>>>> > > -  FwdDeclReplaceMap.push_back(std::make_pair(CanonDecl,
>>>>>>> > > -
>>>>>>>  static_cast<llvm::Value *>(SP)));
>>>>>>> > > +  FwdDeclReplaceMap.emplace_back(
>>>>>>> > > +      std::piecewise_construct, std::make_tuple(CanonDecl),
>>>>>>> > > +      std::make_tuple(static_cast<llvm::Metadata *>(SP)));
>>>>>>> > >    return SP;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -2421,8 +2420,10 @@ CGDebugInfo::getGlobalVariableForwardDec
>>>>>>> > >                                               Line,
>>>>>>> getOrCreateType(T, Unit),
>>>>>>> > >
>>>>>>>  !VD->isExternallyVisible(),
>>>>>>> > >                                               nullptr, nullptr);
>>>>>>> > > -
>>>>>>> FwdDeclReplaceMap.push_back(std::make_pair(cast<VarDecl>(VD->getCanonicalDecl()),
>>>>>>> > > -
>>>>>>>  static_cast<llvm::Value *>(GV)));
>>>>>>> > > +  FwdDeclReplaceMap.emplace_back(
>>>>>>> > > +      std::piecewise_construct,
>>>>>>> > > +      std::make_tuple(cast<VarDecl>(VD->getCanonicalDecl())),
>>>>>>> > > +      std::make_tuple(static_cast<llvm::Metadata *>(GV)));
>>>>>>> > >    return GV;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -2434,13 +2435,10 @@ llvm::DIDescriptor CGDebugInfo::getDecla
>>>>>>> > >    if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
>>>>>>> > >      return getOrCreateType(CGM.getContext().getTypeDeclType(TD),
>>>>>>> > >                             getOrCreateFile(TD->getLocation()));
>>>>>>> > > -  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator I =
>>>>>>> > > -      DeclCache.find(D->getCanonicalDecl());
>>>>>>> > > +  auto I = DeclCache.find(D->getCanonicalDecl());
>>>>>>> > >
>>>>>>> > > -  if (I != DeclCache.end()) {
>>>>>>> > > -    llvm::Value *V = I->second;
>>>>>>> > > -    return
>>>>>>> llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(V));
>>>>>>> > > -  }
>>>>>>> > > +  if (I != DeclCache.end())
>>>>>>> > > +    return
>>>>>>> llvm::DIDescriptor(dyn_cast_or_null<llvm::MDNode>(I->second));
>>>>>>> > >
>>>>>>> > >    // No definition for now. Emit a forward definition that
>>>>>>> might be
>>>>>>> > >    // merged with a potential upcoming definition.
>>>>>>> > > @@ -2465,8 +2463,7 @@ llvm::DISubprogram CGDebugInfo::getFunct
>>>>>>> > >    // Setup context.
>>>>>>> > >    llvm::DIScope S =
>>>>>>> getContextDescriptor(cast<Decl>(D->getDeclContext()));
>>>>>>> > >
>>>>>>> > > -  llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator
>>>>>>> MI =
>>>>>>> > > -      SPCache.find(FD->getCanonicalDecl());
>>>>>>> > > +  auto MI = SPCache.find(FD->getCanonicalDecl());
>>>>>>> > >    if (MI == SPCache.end()) {
>>>>>>> > >      if (const CXXMethodDecl *MD =
>>>>>>> > >              dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) {
>>>>>>> > > @@ -2477,18 +2474,15 @@ llvm::DISubprogram CGDebugInfo::getFunct
>>>>>>> > >      }
>>>>>>> > >    }
>>>>>>> > >    if (MI != SPCache.end()) {
>>>>>>> > > -    llvm::Value *V = MI->second;
>>>>>>> > > -    llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V));
>>>>>>> > > +    llvm::DISubprogram
>>>>>>> SP(dyn_cast_or_null<llvm::MDNode>(MI->second));
>>>>>>> > >      if (SP.isSubprogram() && !SP.isDefinition())
>>>>>>> > >        return SP;
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    for (auto NextFD : FD->redecls()) {
>>>>>>> > > -    llvm::DenseMap<const FunctionDecl *,
>>>>>>> llvm::WeakVH>::iterator MI =
>>>>>>> > > -        SPCache.find(NextFD->getCanonicalDecl());
>>>>>>> > > +    auto MI = SPCache.find(NextFD->getCanonicalDecl());
>>>>>>> > >      if (MI != SPCache.end()) {
>>>>>>> > > -      llvm::Value *V = MI->second;
>>>>>>> > > -      llvm::DISubprogram SP(dyn_cast_or_null<llvm::MDNode>(V));
>>>>>>> > > +      llvm::DISubprogram
>>>>>>> SP(dyn_cast_or_null<llvm::MDNode>(MI->second));
>>>>>>> > >        if (SP.isSubprogram() && !SP.isDefinition())
>>>>>>> > >          return SP;
>>>>>>> > >      }
>>>>>>> > > @@ -2513,7 +2507,7 @@ llvm::DICompositeType CGDebugInfo::getOr
>>>>>>> > >      return getOrCreateMethodType(Method, F);
>>>>>>> > >    if (const ObjCMethodDecl *OMethod =
>>>>>>> dyn_cast<ObjCMethodDecl>(D)) {
>>>>>>> > >      // Add "self" and "_cmd"
>>>>>>> > > -    SmallVector<llvm::Value *, 16> Elts;
>>>>>>> > > +    SmallVector<llvm::Metadata *, 16> Elts;
>>>>>>> > >
>>>>>>> > >      // First element is always return type. For 'void'
>>>>>>> functions it is NULL.
>>>>>>> > >      QualType ResultTy = OMethod->getReturnType();
>>>>>>> > > @@ -2546,7 +2540,7 @@ llvm::DICompositeType CGDebugInfo::getOr
>>>>>>> > >    // unspecified parameter.
>>>>>>> > >    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
>>>>>>> > >      if (FD->isVariadic()) {
>>>>>>> > > -      SmallVector<llvm::Value *, 16> EltTys;
>>>>>>> > > +      SmallVector<llvm::Metadata *, 16> EltTys;
>>>>>>> > >        EltTys.push_back(getOrCreateType(FD->getReturnType(), F));
>>>>>>> > >        if (const FunctionProtoType *FPT =
>>>>>>> dyn_cast<FunctionProtoType>(FnType))
>>>>>>> > >          for (unsigned i = 0, e = FPT->getNumParams(); i != e;
>>>>>>> ++i)
>>>>>>> > > @@ -2581,15 +2575,13 @@ void CGDebugInfo::EmitFunctionStart(Glob
>>>>>>> > >      LinkageName = Fn->getName();
>>>>>>> > >    } else if (const FunctionDecl *FD =
>>>>>>> dyn_cast<FunctionDecl>(D)) {
>>>>>>> > >      // If there is a DISubprogram for this function available
>>>>>>> then use it.
>>>>>>> > > -    llvm::DenseMap<const FunctionDecl *,
>>>>>>> llvm::WeakVH>::iterator FI =
>>>>>>> > > -        SPCache.find(FD->getCanonicalDecl());
>>>>>>> > > +    auto FI = SPCache.find(FD->getCanonicalDecl());
>>>>>>> > >      if (FI != SPCache.end()) {
>>>>>>> > > -      llvm::Value *V = FI->second;
>>>>>>> > > -      llvm::DIDescriptor SP(dyn_cast_or_null<llvm::MDNode>(V));
>>>>>>> > > +      llvm::DIDescriptor
>>>>>>> SP(dyn_cast_or_null<llvm::MDNode>(FI->second));
>>>>>>> > >        if (SP.isSubprogram() &&
>>>>>>> llvm::DISubprogram(SP).isDefinition()) {
>>>>>>> > >          llvm::MDNode *SPN = SP;
>>>>>>> > > -        LexicalBlockStack.push_back(SPN);
>>>>>>> > > -        RegionMap[D] = llvm::WeakVH(SP);
>>>>>>> > > +        LexicalBlockStack.emplace_back(SPN);
>>>>>>> > > +        RegionMap[D].reset(SP);
>>>>>>> > >          return;
>>>>>>> > >        }
>>>>>>> > >      }
>>>>>>> > > @@ -2629,14 +2621,14 @@ void CGDebugInfo::EmitFunctionStart(Glob
>>>>>>> > >    // code for the initialization of globals. Do not record
>>>>>>> these decls
>>>>>>> > >    // as they will overwrite the actual VarDecl Decl in the
>>>>>>> cache.
>>>>>>> > >    if (HasDecl && isa<FunctionDecl>(D))
>>>>>>> > > -    DeclCache.insert(std::make_pair(D->getCanonicalDecl(),
>>>>>>> llvm::WeakVH(SP)));
>>>>>>> > > +
>>>>>>> DeclCache[D->getCanonicalDecl()].reset(static_cast<llvm::Metadata *>(SP));
>>>>>>> > >
>>>>>>> > >    // Push the function onto the lexical block stack.
>>>>>>> > >    llvm::MDNode *SPN = SP;
>>>>>>> > > -  LexicalBlockStack.push_back(SPN);
>>>>>>> > > +  LexicalBlockStack.emplace_back(SPN);
>>>>>>> > >
>>>>>>> > >    if (HasDecl)
>>>>>>> > > -    RegionMap[D] = llvm::WeakVH(SP);
>>>>>>> > > +    RegionMap[D].reset(SP);
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  /// EmitLocation - Emit metadata to indicate a change in
>>>>>>> line/column
>>>>>>> > > @@ -2676,7 +2668,7 @@ void CGDebugInfo::CreateLexicalBlock(Sou
>>>>>>> > >                                                     :
>>>>>>> LexicalBlockStack.back()),
>>>>>>> > >        getOrCreateFile(CurLoc), getLineNumber(CurLoc),
>>>>>>> getColumnNumber(CurLoc));
>>>>>>> > >    llvm::MDNode *DN = D;
>>>>>>> > > -  LexicalBlockStack.push_back(DN);
>>>>>>> > > +  LexicalBlockStack.emplace_back(DN);
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  /// EmitLexicalBlockStart - Constructs the debug code for
>>>>>>> entering a declarative
>>>>>>> > > @@ -2732,7 +2724,7 @@ void CGDebugInfo::EmitFunctionEnd(CGBuil
>>>>>>> > >  llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const
>>>>>>> VarDecl *VD,
>>>>>>> > >                                                         uint64_t
>>>>>>> *XOffset) {
>>>>>>> > >
>>>>>>> > > -  SmallVector<llvm::Value *, 5> EltTys;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 5> EltTys;
>>>>>>> > >    QualType FType;
>>>>>>> > >    uint64_t FieldSize, FieldOffset;
>>>>>>> > >    unsigned FieldAlign;
>>>>>>> > > @@ -3047,7 +3039,7 @@ void CGDebugInfo::EmitDeclareOfBlockLite
>>>>>>> > >    const llvm::StructLayout *blockLayout =
>>>>>>> > >        CGM.getDataLayout().getStructLayout(block.StructureType);
>>>>>>> > >
>>>>>>> > > -  SmallVector<llvm::Value *, 16> fields;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> fields;
>>>>>>> > >    fields.push_back(createFieldType("__isa", C.VoidPtrTy, 0,
>>>>>>> loc, AS_public,
>>>>>>> > >
>>>>>>>  blockLayout->getElementOffsetInBits(0),
>>>>>>> > >                                     tunit, tunit));
>>>>>>> > > @@ -3181,8 +3173,7 @@ llvm::DIDerivedType
>>>>>>> > >  CGDebugInfo::getOrCreateStaticDataMemberDeclarationOrNull(const
>>>>>>> VarDecl *D) {
>>>>>>> > >    if (!D->isStaticDataMember())
>>>>>>> > >      return llvm::DIDerivedType();
>>>>>>> > > -  llvm::DenseMap<const Decl *, llvm::WeakVH>::iterator MI =
>>>>>>> > > -      StaticDataMemberCache.find(D->getCanonicalDecl());
>>>>>>> > > +  auto MI = StaticDataMemberCache.find(D->getCanonicalDecl());
>>>>>>> > >    if (MI != StaticDataMemberCache.end()) {
>>>>>>> > >      assert(MI->second && "Static data member declaration should
>>>>>>> still exist");
>>>>>>> > >      return llvm::DIDerivedType(cast<llvm::MDNode>(MI->second));
>>>>>>> > > @@ -3255,7 +3246,7 @@ void CGDebugInfo::EmitGlobalVariable(llv
>>>>>>> > >          Var->hasInternalLinkage(), Var,
>>>>>>> > >          getOrCreateStaticDataMemberDeclarationOrNull(D));
>>>>>>> > >    }
>>>>>>> > > -  DeclCache.insert(std::make_pair(D->getCanonicalDecl(),
>>>>>>> llvm::WeakVH(GV)));
>>>>>>> > > +
>>>>>>> DeclCache[D->getCanonicalDecl()].reset(static_cast<llvm::Metadata *>(GV));
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  /// EmitGlobalVariable - Emit global variable's debug info.
>>>>>>> > > @@ -3291,13 +3282,12 @@ void CGDebugInfo::EmitGlobalVariable(con
>>>>>>> > >    llvm::DIDescriptor DContext =
>>>>>>> > >
>>>>>>> getContextDescriptor(dyn_cast<Decl>(VD->getDeclContext()));
>>>>>>> > >
>>>>>>> > > -  auto pair = DeclCache.insert(std::make_pair(VD,
>>>>>>> llvm::WeakVH()));
>>>>>>> > > -  if (!pair.second)
>>>>>>> > > +  auto &GV = DeclCache[VD];
>>>>>>> > > +  if (GV)
>>>>>>> > >      return;
>>>>>>> > > -  llvm::DIGlobalVariable GV = DBuilder.createGlobalVariable(
>>>>>>> > > +  GV.reset(DBuilder.createGlobalVariable(
>>>>>>> > >        DContext, Name, StringRef(), Unit,
>>>>>>> getLineNumber(VD->getLocation()), Ty,
>>>>>>> > > -      true, Init,
>>>>>>> getOrCreateStaticDataMemberDeclarationOrNull(VarD));
>>>>>>> > > -  pair.first->second = llvm::WeakVH(GV);
>>>>>>> > > +      true, Init,
>>>>>>> getOrCreateStaticDataMemberDeclarationOrNull(VarD)));
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  llvm::DIScope CGDebugInfo::getCurrentContextDescriptor(const
>>>>>>> Decl *D) {
>>>>>>> > > @@ -3334,7 +3324,7 @@ llvm::DIImportedEntity
>>>>>>> > >  CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) {
>>>>>>> > >    if (CGM.getCodeGenOpts().getDebugInfo() <
>>>>>>> CodeGenOptions::LimitedDebugInfo)
>>>>>>> > >      return llvm::DIImportedEntity(nullptr);
>>>>>>> > > -  llvm::WeakVH &VH = NamespaceAliasCache[&NA];
>>>>>>> > > +  auto &VH = NamespaceAliasCache[&NA];
>>>>>>> > >    if (VH)
>>>>>>> > >      return llvm::DIImportedEntity(cast<llvm::MDNode>(VH));
>>>>>>> > >    llvm::DIImportedEntity R(nullptr);
>>>>>>> > > @@ -3350,7 +3340,7 @@ CGDebugInfo::EmitNamespaceAlias(const Na
>>>>>>> > >
>>>>>>> getCurrentContextDescriptor(cast<Decl>(NA.getDeclContext())),
>>>>>>> > >
>>>>>>> getOrCreateNameSpace(cast<NamespaceDecl>(NA.getAliasedNamespace())),
>>>>>>> > >          getLineNumber(NA.getLocation()), NA.getName());
>>>>>>> > > -  VH = R;
>>>>>>> > > +  VH.reset(R);
>>>>>>> > >    return R;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -3359,8 +3349,7 @@ CGDebugInfo::EmitNamespaceAlias(const Na
>>>>>>> > >  llvm::DINameSpace
>>>>>>> > >  CGDebugInfo::getOrCreateNameSpace(const NamespaceDecl *NSDecl) {
>>>>>>> > >    NSDecl = NSDecl->getCanonicalDecl();
>>>>>>> > > -  llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>::iterator
>>>>>>> I =
>>>>>>> > > -    NameSpaceCache.find(NSDecl);
>>>>>>> > > +  auto I = NameSpaceCache.find(NSDecl);
>>>>>>> > >    if (I != NameSpaceCache.end())
>>>>>>> > >      return llvm::DINameSpace(cast<llvm::MDNode>(I->second));
>>>>>>> > >
>>>>>>> > > @@ -3370,7 +3359,7 @@ CGDebugInfo::getOrCreateNameSpace(const
>>>>>>> > >
>>>>>>> getContextDescriptor(dyn_cast<Decl>(NSDecl->getDeclContext()));
>>>>>>> > >    llvm::DINameSpace NS =
>>>>>>> > >      DBuilder.createNameSpace(Context, NSDecl->getName(), FileD,
>>>>>>> LineNo);
>>>>>>> > > -  NameSpaceCache[NSDecl] = llvm::WeakVH(NS);
>>>>>>> > > +  NameSpaceCache[NSDecl].reset(NS);
>>>>>>> > >    return NS;
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -3401,19 +3390,19 @@ void CGDebugInfo::finalize() {
>>>>>>> > >    for (const auto &p : FwdDeclReplaceMap) {
>>>>>>> > >      assert(p.second);
>>>>>>> > >      llvm::DIDescriptor FwdDecl(cast<llvm::MDNode>(p.second));
>>>>>>> > > -    llvm::WeakVH VH;
>>>>>>> > > +    llvm::Metadata *Repl;
>>>>>>> > >
>>>>>>> > >      auto it = DeclCache.find(p.first);
>>>>>>> > >      // If there has been no definition for the declaration,
>>>>>>> call RAUV
>>>>>>> > >      // with ourselves, that will destroy the temporary MDNode
>>>>>>> and
>>>>>>> > >      // replace it with a standard one, avoiding leaking memory.
>>>>>>> > >      if (it == DeclCache.end())
>>>>>>> > > -      VH = p.second;
>>>>>>> > > +      Repl = p.second;
>>>>>>> > >      else
>>>>>>> > > -      VH = it->second;
>>>>>>> > > +      Repl = it->second;
>>>>>>> > >
>>>>>>> > >      FwdDecl.replaceAllUsesWith(CGM.getLLVMContext(),
>>>>>>> > > -
>>>>>>>  llvm::DIDescriptor(cast<llvm::MDNode>(VH)));
>>>>>>> > > +
>>>>>>>  llvm::DIDescriptor(cast<llvm::MDNode>(Repl)));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    // We keep our own list of retained types, because we need to
>>>>>>> look
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -65,7 +65,7 @@ class CGDebugInfo {
>>>>>>> > >    llvm::DIType BlockLiteralGeneric;
>>>>>>> > >
>>>>>>> > >    /// TypeCache - Cache of previously constructed Types.
>>>>>>> > > -  llvm::DenseMap<const void *, llvm::WeakVH> TypeCache;
>>>>>>> > > +  llvm::DenseMap<const void *, llvm::TrackingMDRef> TypeCache;
>>>>>>> > >
>>>>>>> > >    struct ObjCInterfaceCacheEntry {
>>>>>>> > >      const ObjCInterfaceType *Type;
>>>>>>> > > @@ -85,15 +85,16 @@ class CGDebugInfo {
>>>>>>> > >
>>>>>>> > >    /// ReplaceMap - Cache of forward declared types to RAUW at
>>>>>>> the end of
>>>>>>> > >    /// compilation.
>>>>>>> > > -  std::vector<std::pair<const TagType *, llvm::WeakVH>>
>>>>>>> ReplaceMap;
>>>>>>> > > +  std::vector<std::pair<const TagType *, llvm::TrackingMDRef>>
>>>>>>> ReplaceMap;
>>>>>>> > >
>>>>>>> > >    /// \brief Cache of replaceable forward declarartions
>>>>>>> (functions and
>>>>>>> > >    /// variables) to RAUW at the end of compilation.
>>>>>>> > > -  std::vector<std::pair<const DeclaratorDecl *, llvm::WeakVH>>
>>>>>>> FwdDeclReplaceMap;
>>>>>>> > > +  std::vector<std::pair<const DeclaratorDecl *,
>>>>>>> llvm::TrackingMDRef>>
>>>>>>> > > +      FwdDeclReplaceMap;
>>>>>>> > >
>>>>>>> > >    // LexicalBlockStack - Keep track of our current nested
>>>>>>> lexical block.
>>>>>>> > > -  std::vector<llvm::TrackingVH<llvm::MDNode> >
>>>>>>> LexicalBlockStack;
>>>>>>> > > -  llvm::DenseMap<const Decl *, llvm::WeakVH> RegionMap;
>>>>>>> > > +  std::vector<llvm::TrackingMDNodeRef> LexicalBlockStack;
>>>>>>> > > +  llvm::DenseMap<const Decl *, llvm::TrackingMDRef> RegionMap;
>>>>>>> > >    // FnBeginRegionCount - Keep track of LexicalBlockStack
>>>>>>> counter at the
>>>>>>> > >    // beginning of a function. This is used to pop unbalanced
>>>>>>> regions at
>>>>>>> > >    // the end of a function.
>>>>>>> > > @@ -104,14 +105,15 @@ class CGDebugInfo {
>>>>>>> > >    llvm::BumpPtrAllocator DebugInfoNames;
>>>>>>> > >    StringRef CWDName;
>>>>>>> > >
>>>>>>> > > -  llvm::DenseMap<const char *, llvm::WeakVH> DIFileCache;
>>>>>>> > > -  llvm::DenseMap<const FunctionDecl *, llvm::WeakVH> SPCache;
>>>>>>> > > +  llvm::DenseMap<const char *, llvm::TrackingMDRef> DIFileCache;
>>>>>>> > > +  llvm::DenseMap<const FunctionDecl *, llvm::TrackingMDRef>
>>>>>>> SPCache;
>>>>>>> > >    /// \brief Cache declarations relevant to
>>>>>>> DW_TAG_imported_declarations (C++
>>>>>>> > >    /// using declarations) that aren't covered by other more
>>>>>>> specific caches.
>>>>>>> > > -  llvm::DenseMap<const Decl *, llvm::WeakVH> DeclCache;
>>>>>>> > > -  llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH>
>>>>>>> NameSpaceCache;
>>>>>>> > > -  llvm::DenseMap<const NamespaceAliasDecl *, llvm::WeakVH>
>>>>>>> NamespaceAliasCache;
>>>>>>> > > -  llvm::DenseMap<const Decl *, llvm::WeakVH>
>>>>>>> StaticDataMemberCache;
>>>>>>> > > +  llvm::DenseMap<const Decl *, llvm::TrackingMDRef> DeclCache;
>>>>>>> > > +  llvm::DenseMap<const NamespaceDecl *, llvm::TrackingMDRef>
>>>>>>> NameSpaceCache;
>>>>>>> > > +  llvm::DenseMap<const NamespaceAliasDecl *,
>>>>>>> llvm::TrackingMDRef>
>>>>>>> > > +      NamespaceAliasCache;
>>>>>>> > > +  llvm::DenseMap<const Decl *, llvm::TrackingMDRef>
>>>>>>> StaticDataMemberCache;
>>>>>>> > >
>>>>>>> > >    /// Helper functions for getOrCreateType.
>>>>>>> > >    unsigned Checksum(const ObjCInterfaceDecl *InterfaceDecl);
>>>>>>> > > @@ -162,14 +164,12 @@ class CGDebugInfo {
>>>>>>> > >                                               llvm::DIFile F,
>>>>>>> > >                                               llvm::DIType
>>>>>>> RecordTy);
>>>>>>> > >
>>>>>>> > > -  void CollectCXXMemberFunctions(const CXXRecordDecl *Decl,
>>>>>>> > > -                                 llvm::DIFile F,
>>>>>>> > > -                                 SmallVectorImpl<llvm::Value *>
>>>>>>> &E,
>>>>>>> > > +  void CollectCXXMemberFunctions(const CXXRecordDecl *Decl,
>>>>>>> llvm::DIFile F,
>>>>>>> > > +                                 SmallVectorImpl<llvm::Metadata
>>>>>>> *> &E,
>>>>>>> > >                                   llvm::DIType T);
>>>>>>> > >
>>>>>>> > > -  void CollectCXXBases(const CXXRecordDecl *Decl,
>>>>>>> > > -                       llvm::DIFile F,
>>>>>>> > > -                       SmallVectorImpl<llvm::Value *> &EltTys,
>>>>>>> > > +  void CollectCXXBases(const CXXRecordDecl *Decl, llvm::DIFile
>>>>>>> F,
>>>>>>> > > +                       SmallVectorImpl<llvm::Metadata *>
>>>>>>> &EltTys,
>>>>>>> > >                         llvm::DIType RecordTy);
>>>>>>> > >
>>>>>>> > >    llvm::DIArray
>>>>>>> > > @@ -192,23 +192,21 @@ class CGDebugInfo {
>>>>>>> > >
>>>>>>> > >    // Helpers for collecting fields of a record.
>>>>>>> > >    void CollectRecordLambdaFields(const CXXRecordDecl *CXXDecl,
>>>>>>> > > -                                 SmallVectorImpl<llvm::Value *>
>>>>>>> &E,
>>>>>>> > > +                                 SmallVectorImpl<llvm::Metadata
>>>>>>> *> &E,
>>>>>>> > >                                   llvm::DIType RecordTy);
>>>>>>> > >    llvm::DIDerivedType CreateRecordStaticField(const VarDecl
>>>>>>> *Var,
>>>>>>> > >                                                llvm::DIType
>>>>>>> RecordTy,
>>>>>>> > >                                                const RecordDecl*
>>>>>>> RD);
>>>>>>> > >    void CollectRecordNormalField(const FieldDecl *Field,
>>>>>>> uint64_t OffsetInBits,
>>>>>>> > >                                  llvm::DIFile F,
>>>>>>> > > -                                SmallVectorImpl<llvm::Value *>
>>>>>>> &E,
>>>>>>> > > -                                llvm::DIType RecordTy,
>>>>>>> > > -                                const RecordDecl* RD);
>>>>>>> > > +                                SmallVectorImpl<llvm::Metadata
>>>>>>> *> &E,
>>>>>>> > > +                                llvm::DIType RecordTy, const
>>>>>>> RecordDecl *RD);
>>>>>>> > >    void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile
>>>>>>> F,
>>>>>>> > > -                           SmallVectorImpl<llvm::Value *> &E,
>>>>>>> > > +                           SmallVectorImpl<llvm::Metadata *> &E,
>>>>>>> > >                             llvm::DICompositeType RecordTy);
>>>>>>> > >
>>>>>>> > > -  void CollectVTableInfo(const CXXRecordDecl *Decl,
>>>>>>> > > -                         llvm::DIFile F,
>>>>>>> > > -                         SmallVectorImpl<llvm::Value *>
>>>>>>> &EltTys);
>>>>>>> > > +  void CollectVTableInfo(const CXXRecordDecl *Decl,
>>>>>>> llvm::DIFile F,
>>>>>>> > > +                         SmallVectorImpl<llvm::Metadata *>
>>>>>>> &EltTys);
>>>>>>> > >
>>>>>>> > >    // CreateLexicalBlock - Create a new lexical block node and
>>>>>>> push it on
>>>>>>> > >    // the stack.
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -1415,8 +1415,8 @@ llvm::Value *CodeGenFunction::EmitExtVec
>>>>>>> > >  RValue CodeGenFunction::EmitLoadOfGlobalRegLValue(LValue LV) {
>>>>>>> > >    assert((LV.getType()->isIntegerType() ||
>>>>>>> LV.getType()->isPointerType()) &&
>>>>>>> > >           "Bad type for register variable");
>>>>>>> > > -  llvm::MDNode *RegName =
>>>>>>> dyn_cast<llvm::MDNode>(LV.getGlobalReg());
>>>>>>> > > -  assert(RegName && "Register LValue is not metadata");
>>>>>>> > > +  llvm::MDNode *RegName = cast<llvm::MDNode>(
>>>>>>> > > +
>>>>>>> cast<llvm::MetadataAsValue>(LV.getGlobalReg())->getMetadata());
>>>>>>> > >
>>>>>>> > >    // We accept integer and pointer types only
>>>>>>> > >    llvm::Type *OrigTy = CGM.getTypes().ConvertType(LV.getType());
>>>>>>> > > @@ -1426,7 +1426,8 @@ RValue CodeGenFunction::EmitLoadOfGlobal
>>>>>>> > >    llvm::Type *Types[] = { Ty };
>>>>>>> > >
>>>>>>> > >    llvm::Value *F =
>>>>>>> CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
>>>>>>> > > -  llvm::Value *Call = Builder.CreateCall(F, RegName);
>>>>>>> > > +  llvm::Value *Call = Builder.CreateCall(
>>>>>>> > > +      F, llvm::MetadataAsValue::get(Ty->getContext(), RegName));
>>>>>>> > >    if (OrigTy->isPointerTy())
>>>>>>> > >      Call = Builder.CreateIntToPtr(Call, OrigTy);
>>>>>>> > >    return RValue::get(Call);
>>>>>>> > > @@ -1680,7 +1681,8 @@ void CodeGenFunction::EmitStoreThroughEx
>>>>>>> > >  void CodeGenFunction::EmitStoreThroughGlobalRegLValue(RValue
>>>>>>> Src, LValue Dst) {
>>>>>>> > >    assert((Dst.getType()->isIntegerType() ||
>>>>>>> Dst.getType()->isPointerType()) &&
>>>>>>> > >           "Bad type for register variable");
>>>>>>> > > -  llvm::MDNode *RegName =
>>>>>>> dyn_cast<llvm::MDNode>(Dst.getGlobalReg());
>>>>>>> > > +  llvm::MDNode *RegName = cast<llvm::MDNode>(
>>>>>>> > > +
>>>>>>> cast<llvm::MetadataAsValue>(Dst.getGlobalReg())->getMetadata());
>>>>>>> > >    assert(RegName && "Register LValue is not metadata");
>>>>>>> > >
>>>>>>> > >    // We accept integer and pointer types only
>>>>>>> > > @@ -1694,7 +1696,8 @@ void CodeGenFunction::EmitStoreThroughGl
>>>>>>> > >    llvm::Value *Value = Src.getScalarVal();
>>>>>>> > >    if (OrigTy->isPointerTy())
>>>>>>> > >      Value = Builder.CreatePtrToInt(Value, Ty);
>>>>>>> > > -  Builder.CreateCall2(F, RegName, Value);
>>>>>>> > > +  Builder.CreateCall2(F,
>>>>>>> llvm::MetadataAsValue::get(Ty->getContext(), RegName),
>>>>>>> > > +                      Value);
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  // setObjCGCLValueClass - sets class of the lvalue for the
>>>>>>> purpose of
>>>>>>> > > @@ -1889,10 +1892,12 @@ static LValue EmitGlobalNamedRegister(co
>>>>>>> > >    if (M->getNumOperands() == 0) {
>>>>>>> > >      llvm::MDString *Str =
>>>>>>> llvm::MDString::get(CGM.getLLVMContext(),
>>>>>>> > >                                                Asm->getLabel());
>>>>>>> > > -    llvm::Value *Ops[] = { Str };
>>>>>>> > > +    llvm::Metadata *Ops[] = {Str};
>>>>>>> > >      M->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
>>>>>>> > >    }
>>>>>>> > > -  return LValue::MakeGlobalReg(M->getOperand(0), VD->getType(),
>>>>>>> Alignment);
>>>>>>> > > +  return LValue::MakeGlobalReg(
>>>>>>> > > +      llvm::MetadataAsValue::get(CGM.getLLVMContext(),
>>>>>>> M->getOperand(0)),
>>>>>>> > > +      VD->getType(), Alignment);
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E)
>>>>>>> {
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGLoopInfo.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGLoopInfo.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGLoopInfo.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGLoopInfo.cpp Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -24,40 +24,39 @@ static MDNode *createMetadata(LLVMContex
>>>>>>> > >        Attrs.VectorizerEnable == LoopAttributes::VecUnspecified)
>>>>>>> > >      return nullptr;
>>>>>>> > >
>>>>>>> > > -  SmallVector<Value *, 4> Args;
>>>>>>> > > +  SmallVector<Metadata *, 4> Args;
>>>>>>> > >    // Reserve operand 0 for loop id self reference.
>>>>>>> > >    MDNode *TempNode = MDNode::getTemporary(Ctx, None);
>>>>>>> > >    Args.push_back(TempNode);
>>>>>>> > >
>>>>>>> > >    // Setting vectorizer.width
>>>>>>> > >    if (Attrs.VectorizerWidth > 0) {
>>>>>>> > > -    Value *Vals[] = { MDString::get(Ctx,
>>>>>>> "llvm.loop.vectorize.width"),
>>>>>>> > > -                      ConstantInt::get(Type::getInt32Ty(Ctx),
>>>>>>> > > -                                       Attrs.VectorizerWidth) };
>>>>>>> > > +    Metadata *Vals[] = {MDString::get(Ctx,
>>>>>>> "llvm.loop.vectorize.width"),
>>>>>>> > > +
>>>>>>> ConstantAsMetadata::get(ConstantInt::get(
>>>>>>> > > +                            Type::getInt32Ty(Ctx),
>>>>>>> Attrs.VectorizerWidth))};
>>>>>>> > >      Args.push_back(MDNode::get(Ctx, Vals));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    // Setting vectorizer.unroll
>>>>>>> > >    if (Attrs.VectorizerUnroll > 0) {
>>>>>>> > > -    Value *Vals[] = { MDString::get(Ctx,
>>>>>>> "llvm.loop.interleave.count"),
>>>>>>> > > -                      ConstantInt::get(Type::getInt32Ty(Ctx),
>>>>>>> > > -                                       Attrs.VectorizerUnroll)
>>>>>>> };
>>>>>>> > > +    Metadata *Vals[] = {MDString::get(Ctx,
>>>>>>> "llvm.loop.interleave.count"),
>>>>>>> > > +
>>>>>>> ConstantAsMetadata::get(ConstantInt::get(
>>>>>>> > > +                            Type::getInt32Ty(Ctx),
>>>>>>> Attrs.VectorizerUnroll))};
>>>>>>> > >      Args.push_back(MDNode::get(Ctx, Vals));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    // Setting vectorizer.enable
>>>>>>> > >    if (Attrs.VectorizerEnable != LoopAttributes::VecUnspecified)
>>>>>>> {
>>>>>>> > > -    Value *Vals[] = { MDString::get(Ctx,
>>>>>>> "llvm.loop.vectorize.enable"),
>>>>>>> > > -                      ConstantInt::get(Type::getInt1Ty(Ctx),
>>>>>>> > > -                                       (Attrs.VectorizerEnable
>>>>>>> ==
>>>>>>> > > -
>>>>>>> LoopAttributes::VecEnable)) };
>>>>>>> > > +    Metadata *Vals[] = {
>>>>>>> > > +        MDString::get(Ctx, "llvm.loop.vectorize.enable"),
>>>>>>> > > +        ConstantAsMetadata::get(ConstantInt::get(
>>>>>>> > > +            Type::getInt1Ty(Ctx),
>>>>>>> > > +            (Attrs.VectorizerEnable ==
>>>>>>> LoopAttributes::VecEnable)))};
>>>>>>> > >      Args.push_back(MDNode::get(Ctx, Vals));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > -  MDNode *LoopID = MDNode::get(Ctx, Args);
>>>>>>> > > -  assert(LoopID->use_empty() && "LoopID should not be used");
>>>>>>> > > -
>>>>>>> > >    // Set the first operand to itself.
>>>>>>> > > +  MDNode *LoopID = MDNode::get(Ctx, Args);
>>>>>>> > >    LoopID->replaceOperandWith(0, LoopID);
>>>>>>> > >    MDNode::deleteTemporary(TempNode);
>>>>>>> > >    return LoopID;
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGObjC.cpp Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -1938,9 +1938,8 @@ llvm::Value *CodeGenFunction::EmitARCRet
>>>>>>> > >        = cast<llvm::CallInst>(result->stripPointerCasts());
>>>>>>> > >      assert(call->getCalledValue() ==
>>>>>>> CGM.getARCEntrypoints().objc_retainBlock);
>>>>>>> > >
>>>>>>> > > -    SmallVector<llvm::Value*,1> args;
>>>>>>> > >      call->setMetadata("clang.arc.copy_on_escape",
>>>>>>> > > -                      llvm::MDNode::get(Builder.getContext(),
>>>>>>> args));
>>>>>>> > > +                      llvm::MDNode::get(Builder.getContext(),
>>>>>>> None));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    return result;
>>>>>>> > > @@ -1982,8 +1981,8 @@ CodeGenFunction::EmitARCRetainAutoreleas
>>>>>>> > >
>>>>>>> "clang.arc.retainAutoreleasedReturnValueMarker");
>>>>>>> > >        assert(metadata->getNumOperands() <= 1);
>>>>>>> > >        if (metadata->getNumOperands() == 0) {
>>>>>>> > > -        llvm::Value *string =
>>>>>>> llvm::MDString::get(getLLVMContext(), assembly);
>>>>>>> > > -
>>>>>>> metadata->addOperand(llvm::MDNode::get(getLLVMContext(), string));
>>>>>>> > > +        metadata->addOperand(llvm::MDNode::get(
>>>>>>> > > +            getLLVMContext(),
>>>>>>> llvm::MDString::get(getLLVMContext(), assembly)));
>>>>>>> > >        }
>>>>>>> > >      }
>>>>>>> > >    }
>>>>>>> > > @@ -2016,9 +2015,8 @@ void CodeGenFunction::EmitARCRelease(llv
>>>>>>> > >    llvm::CallInst *call = EmitNounwindRuntimeCall(fn, value);
>>>>>>> > >
>>>>>>> > >    if (precise == ARCImpreciseLifetime) {
>>>>>>> > > -    SmallVector<llvm::Value*,1> args;
>>>>>>> > >      call->setMetadata("clang.imprecise_release",
>>>>>>> > > -                      llvm::MDNode::get(Builder.getContext(),
>>>>>>> args));
>>>>>>> > > +                      llvm::MDNode::get(Builder.getContext(),
>>>>>>> None));
>>>>>>> > >    }
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -1296,11 +1296,11 @@ CGObjCGNU::GenerateMessageSendSuper(Code
>>>>>>> > >    llvm::Value *imp = LookupIMPSuper(CGF, ObjCSuper, cmd, MSI);
>>>>>>> > >    imp = EnforceType(Builder, imp, MSI.MessengerType);
>>>>>>> > >
>>>>>>> > > -  llvm::Value *impMD[] = {
>>>>>>> > > +  llvm::Metadata *impMD[] = {
>>>>>>> > >        llvm::MDString::get(VMContext, Sel.getAsString()),
>>>>>>> > >        llvm::MDString::get(VMContext,
>>>>>>> Class->getSuperClass()->getNameAsString()),
>>>>>>> > > -      llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext),
>>>>>>> IsClassMessage)
>>>>>>> > > -   };
>>>>>>> > > +      llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
>>>>>>> > > +          llvm::Type::getInt1Ty(VMContext), IsClassMessage))};
>>>>>>> > >    llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD);
>>>>>>> > >
>>>>>>> > >    llvm::Instruction *call;
>>>>>>> > > @@ -1371,12 +1371,11 @@ CGObjCGNU::GenerateMessageSend(CodeGenFu
>>>>>>> > >    cmd = EnforceType(Builder, cmd, SelectorTy);
>>>>>>> > >    Receiver = EnforceType(Builder, Receiver, IdTy);
>>>>>>> > >
>>>>>>> > > -  llvm::Value *impMD[] = {
>>>>>>> > > -        llvm::MDString::get(VMContext, Sel.getAsString()),
>>>>>>> > > -        llvm::MDString::get(VMContext, Class ?
>>>>>>> Class->getNameAsString() :""),
>>>>>>> > > -        llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext),
>>>>>>> > > -                               Class!=nullptr)
>>>>>>> > > -   };
>>>>>>> > > +  llvm::Metadata *impMD[] = {
>>>>>>> > > +      llvm::MDString::get(VMContext, Sel.getAsString()),
>>>>>>> > > +      llvm::MDString::get(VMContext, Class ?
>>>>>>> Class->getNameAsString() : ""),
>>>>>>> > > +      llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
>>>>>>> > > +          llvm::Type::getInt1Ty(VMContext), Class != nullptr))};
>>>>>>> > >    llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD);
>>>>>>> > >
>>>>>>> > >    CallArgList ActualArgs;
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -4278,11 +4278,10 @@ void CGObjCCommonMac::EmitImageInfo() {
>>>>>>> > >                          eImageInfo_GCOnly);
>>>>>>> > >
>>>>>>> > >        // Require that GC be specified and set to
>>>>>>> eImageInfo_GarbageCollected.
>>>>>>> > > -      llvm::Value *Ops[2] = {
>>>>>>> > > -        llvm::MDString::get(VMContext, "Objective-C Garbage
>>>>>>> Collection"),
>>>>>>> > > -
>>>>>>> llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
>>>>>>> > > -                               eImageInfo_GarbageCollected)
>>>>>>> > > -      };
>>>>>>> > > +      llvm::Metadata *Ops[2] = {
>>>>>>> > > +          llvm::MDString::get(VMContext, "Objective-C Garbage
>>>>>>> Collection"),
>>>>>>> > > +          llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
>>>>>>> > > +              llvm::Type::getInt32Ty(VMContext),
>>>>>>> eImageInfo_GarbageCollected))};
>>>>>>> > >        Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC
>>>>>>> Only",
>>>>>>> > >                          llvm::MDNode::get(VMContext, Ops));
>>>>>>> > >      }
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Tue Dec  9 12:39:32 2014
>>>>>>> > > @@ -591,7 +591,9 @@ void CodeGenFunction::EmitCondBrHints(ll
>>>>>>> > >      return;
>>>>>>> > >
>>>>>>> > >    // Add vectorize and unroll hints to the metadata on the
>>>>>>> conditional branch.
>>>>>>> > > -  SmallVector<llvm::Value *, 2> Metadata(1);
>>>>>>> > > +  //
>>>>>>> > > +  // FIXME: Should this really start with a size of 1?
>>>>>>> > > +  SmallVector<llvm::Metadata *, 2> Metadata(1);
>>>>>>> > >    for (const auto *Attr : Attrs) {
>>>>>>> > >      const LoopHintAttr *LH = dyn_cast<LoopHintAttr>(Attr);
>>>>>>> > >
>>>>>>> > > @@ -629,7 +631,7 @@ void CodeGenFunction::EmitCondBrHints(ll
>>>>>>> > >        ValueInt = static_cast<int>(ValueAPS.getSExtValue());
>>>>>>> > >      }
>>>>>>> > >
>>>>>>> > > -    llvm::Value *Value;
>>>>>>> > > +    llvm::Constant *Value;
>>>>>>> > >      llvm::MDString *Name;
>>>>>>> > >      switch (Option) {
>>>>>>> > >      case LoopHintAttr::Vectorize:
>>>>>>> > > @@ -656,15 +658,16 @@ void CodeGenFunction::EmitCondBrHints(ll
>>>>>>> > >        break;
>>>>>>> > >      }
>>>>>>> > >
>>>>>>> > > -    SmallVector<llvm::Value *, 2> OpValues;
>>>>>>> > > +    SmallVector<llvm::Metadata *, 2> OpValues;
>>>>>>> > >      OpValues.push_back(Name);
>>>>>>> > >      if (Value)
>>>>>>> > > -      OpValues.push_back(Value);
>>>>>>> > > +      OpValues.push_back(llvm::ConstantAsMetadata::get(Value));
>>>>>>> > >
>>>>>>> > >      // Set or overwrite metadata indicated by Name.
>>>>>>> > >      Metadata.push_back(llvm::MDNode::get(Context, OpValues));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > +  // FIXME: This condition is never false.  Should it be an
>>>>>>> assert?
>>>>>>> > >    if (!Metadata.empty()) {
>>>>>>> > >      // Add llvm.loop MDNode to CondBr.
>>>>>>> > >      llvm::MDNode *LoopID = llvm::MDNode::get(Context, Metadata);
>>>>>>> > > @@ -1766,10 +1769,10 @@ llvm::Value* CodeGenFunction::EmitAsmInp
>>>>>>> > >  /// asm.
>>>>>>> > >  static llvm::MDNode *getAsmSrcLocInfo(const StringLiteral *Str,
>>>>>>> > >                                        CodeGenFunction &CGF) {
>>>>>>> > > -  SmallVector<llvm::Value *, 8> Locs;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> Locs;
>>>>>>> > >    // Add the location of the first line to the MDNode.
>>>>>>> > > -  Locs.push_back(llvm::ConstantInt::get(CGF.Int32Ty,
>>>>>>> > > -
>>>>>>> Str->getLocStart().getRawEncoding()));
>>>>>>> > > +
>>>>>>> Locs.push_back(llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
>>>>>>> > > +      CGF.Int32Ty, Str->getLocStart().getRawEncoding())));
>>>>>>> > >    StringRef StrVal = Str->getString();
>>>>>>> > >    if (!StrVal.empty()) {
>>>>>>> > >      const SourceManager &SM =
>>>>>>> CGF.CGM.getContext().getSourceManager();
>>>>>>> > > @@ -1781,8 +1784,8 @@ static llvm::MDNode *getAsmSrcLocInfo(co
>>>>>>> > >        if (StrVal[i] != '\n') continue;
>>>>>>> > >        SourceLocation LineLoc = Str->getLocationOfByte(i+1, SM,
>>>>>>> LangOpts,
>>>>>>> > >
>>>>>>> CGF.getTarget());
>>>>>>> > > -      Locs.push_back(llvm::ConstantInt::get(CGF.Int32Ty,
>>>>>>> > > -
>>>>>>> LineLoc.getRawEncoding()));
>>>>>>> > > +      Locs.push_back(llvm::ConstantAsMetadata::get(
>>>>>>> > > +          llvm::ConstantInt::get(CGF.Int32Ty,
>>>>>>> LineLoc.getRawEncoding())));
>>>>>>> > >      }
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > @@ -2052,7 +2055,9 @@ void CodeGenFunction::EmitAsmStmt(const
>>>>>>> > >    } else {
>>>>>>> > >      // At least put the line number on MS inline asm blobs.
>>>>>>> > >      auto Loc = llvm::ConstantInt::get(Int32Ty,
>>>>>>> S.getAsmLoc().getRawEncoding());
>>>>>>> > > -    Result->setMetadata("srcloc",
>>>>>>> llvm::MDNode::get(getLLVMContext(), Loc));
>>>>>>> > > +    Result->setMetadata("srcloc",
>>>>>>> > > +                        llvm::MDNode::get(getLLVMContext(),
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Loc)));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    // Extract all of the register value results from the asm.
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Tue Dec  9
>>>>>>> 12:39:32 2014
>>>>>>> > > @@ -349,9 +349,9 @@ void CodeGenFunction::EmitMCountInstrume
>>>>>>> > >  // information in the program executable. The argument
>>>>>>> information stored
>>>>>>> > >  // includes the argument name, its type, the address and access
>>>>>>> qualifiers used.
>>>>>>> > >  static void GenOpenCLArgMetadata(const FunctionDecl *FD,
>>>>>>> llvm::Function *Fn,
>>>>>>> > > -                                 CodeGenModule
>>>>>>> &CGM,llvm::LLVMContext &Context,
>>>>>>> > > -                                 SmallVector <llvm::Value*, 5>
>>>>>>> &kernelMDArgs,
>>>>>>> > > -                                 CGBuilderTy& Builder,
>>>>>>> ASTContext &ASTCtx) {
>>>>>>> > > +                                 CodeGenModule &CGM,
>>>>>>> llvm::LLVMContext &Context,
>>>>>>> > > +                                 SmallVector<llvm::Metadata *,
>>>>>>> 5> &kernelMDArgs,
>>>>>>> > > +                                 CGBuilderTy &Builder,
>>>>>>> ASTContext &ASTCtx) {
>>>>>>> > >    // Create MDNodes that represent the kernel arg metadata.
>>>>>>> > >    // Each MDNode is a list in the form of "key", N number of
>>>>>>> values which is
>>>>>>> > >    // the same number of values as their are kernel arguments.
>>>>>>> > > @@ -359,28 +359,28 @@ static void GenOpenCLArgMetadata(const F
>>>>>>> > >    const PrintingPolicy &Policy = ASTCtx.getPrintingPolicy();
>>>>>>> > >
>>>>>>> > >    // MDNode for the kernel argument address space qualifiers.
>>>>>>> > > -  SmallVector<llvm::Value*, 8> addressQuals;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> addressQuals;
>>>>>>> > >    addressQuals.push_back(llvm::MDString::get(Context,
>>>>>>> "kernel_arg_addr_space"));
>>>>>>> > >
>>>>>>> > >    // MDNode for the kernel argument access qualifiers (images
>>>>>>> only).
>>>>>>> > > -  SmallVector<llvm::Value*, 8> accessQuals;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> accessQuals;
>>>>>>> > >    accessQuals.push_back(llvm::MDString::get(Context,
>>>>>>> "kernel_arg_access_qual"));
>>>>>>> > >
>>>>>>> > >    // MDNode for the kernel argument type names.
>>>>>>> > > -  SmallVector<llvm::Value*, 8> argTypeNames;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> argTypeNames;
>>>>>>> > >    argTypeNames.push_back(llvm::MDString::get(Context,
>>>>>>> "kernel_arg_type"));
>>>>>>> > >
>>>>>>> > >    // MDNode for the kernel argument base type names.
>>>>>>> > > -  SmallVector<llvm::Value*, 8> argBaseTypeNames;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> argBaseTypeNames;
>>>>>>> > >    argBaseTypeNames.push_back(
>>>>>>> > >        llvm::MDString::get(Context, "kernel_arg_base_type"));
>>>>>>> > >
>>>>>>> > >    // MDNode for the kernel argument type qualifiers.
>>>>>>> > > -  SmallVector<llvm::Value*, 8> argTypeQuals;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> argTypeQuals;
>>>>>>> > >    argTypeQuals.push_back(llvm::MDString::get(Context,
>>>>>>> "kernel_arg_type_qual"));
>>>>>>> > >
>>>>>>> > >    // MDNode for the kernel argument names.
>>>>>>> > > -  SmallVector<llvm::Value*, 8> argNames;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 8> argNames;
>>>>>>> > >    argNames.push_back(llvm::MDString::get(Context,
>>>>>>> "kernel_arg_name"));
>>>>>>> > >
>>>>>>> > >    for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
>>>>>>> > > @@ -392,8 +392,8 @@ static void GenOpenCLArgMetadata(const F
>>>>>>> > >        QualType pointeeTy = ty->getPointeeType();
>>>>>>> > >
>>>>>>> > >        // Get address qualifier.
>>>>>>> > > -
>>>>>>> addressQuals.push_back(Builder.getInt32(ASTCtx.getTargetAddressSpace(
>>>>>>> > > -        pointeeTy.getAddressSpace())));
>>>>>>> > > +
>>>>>>> addressQuals.push_back(llvm::ConstantAsMetadata::get(Builder.getInt32(
>>>>>>> > > +
>>>>>>> ASTCtx.getTargetAddressSpace(pointeeTy.getAddressSpace()))));
>>>>>>> > >
>>>>>>> > >        // Get argument type name.
>>>>>>> > >        std::string typeName =
>>>>>>> > > @@ -432,7 +432,8 @@ static void GenOpenCLArgMetadata(const F
>>>>>>> > >          AddrSpc =
>>>>>>> > >
>>>>>>> CGM.getContext().getTargetAddressSpace(LangAS::opencl_global);
>>>>>>> > >
>>>>>>> > > -      addressQuals.push_back(Builder.getInt32(AddrSpc));
>>>>>>> > > +      addressQuals.push_back(
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(AddrSpc)));
>>>>>>> > >
>>>>>>> > >        // Get argument type name.
>>>>>>> > >        std::string typeName =
>>>>>>> ty.getUnqualifiedType().getAsString(Policy);
>>>>>>> > > @@ -495,8 +496,8 @@ void CodeGenFunction::EmitOpenCLKernelMe
>>>>>>> > >
>>>>>>> > >    llvm::LLVMContext &Context = getLLVMContext();
>>>>>>> > >
>>>>>>> > > -  SmallVector <llvm::Value*, 5> kernelMDArgs;
>>>>>>> > > -  kernelMDArgs.push_back(Fn);
>>>>>>> > > +  SmallVector<llvm::Metadata *, 5> kernelMDArgs;
>>>>>>> > > +  kernelMDArgs.push_back(llvm::ConstantAsMetadata::get(Fn));
>>>>>>> > >
>>>>>>> > >    GenOpenCLArgMetadata(FD, Fn, CGM, Context, kernelMDArgs,
>>>>>>> Builder,
>>>>>>> > >                         getContext());
>>>>>>> > > @@ -507,33 +508,31 @@ void CodeGenFunction::EmitOpenCLKernelMe
>>>>>>> > >      bool isSignedInteger =
>>>>>>> > >          hintQTy->isSignedIntegerType() ||
>>>>>>> > >          (hintEltQTy &&
>>>>>>> hintEltQTy->getElementType()->isSignedIntegerType());
>>>>>>> > > -    llvm::Value *attrMDArgs[] = {
>>>>>>> > > -      llvm::MDString::get(Context, "vec_type_hint"),
>>>>>>> > > -
>>>>>>> llvm::UndefValue::get(CGM.getTypes().ConvertType(A->getTypeHint())),
>>>>>>> > > -      llvm::ConstantInt::get(
>>>>>>> > > -          llvm::IntegerType::get(Context, 32),
>>>>>>> > > -          llvm::APInt(32, (uint64_t)(isSignedInteger ? 1 : 0)))
>>>>>>> > > -    };
>>>>>>> > > +    llvm::Metadata *attrMDArgs[] = {
>>>>>>> > > +        llvm::MDString::get(Context, "vec_type_hint"),
>>>>>>> > > +        llvm::ConstantAsMetadata::get(llvm::UndefValue::get(
>>>>>>> > > +            CGM.getTypes().ConvertType(A->getTypeHint()))),
>>>>>>> > > +        llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
>>>>>>> > > +            llvm::IntegerType::get(Context, 32),
>>>>>>> > > +            llvm::APInt(32, (uint64_t)(isSignedInteger ? 1 :
>>>>>>> 0))))};
>>>>>>> > >      kernelMDArgs.push_back(llvm::MDNode::get(Context,
>>>>>>> attrMDArgs));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    if (const WorkGroupSizeHintAttr *A =
>>>>>>> FD->getAttr<WorkGroupSizeHintAttr>()) {
>>>>>>> > > -    llvm::Value *attrMDArgs[] = {
>>>>>>> > > -      llvm::MDString::get(Context, "work_group_size_hint"),
>>>>>>> > > -      Builder.getInt32(A->getXDim()),
>>>>>>> > > -      Builder.getInt32(A->getYDim()),
>>>>>>> > > -      Builder.getInt32(A->getZDim())
>>>>>>> > > -    };
>>>>>>> > > +    llvm::Metadata *attrMDArgs[] = {
>>>>>>> > > +        llvm::MDString::get(Context, "work_group_size_hint"),
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
>>>>>>> > >      kernelMDArgs.push_back(llvm::MDNode::get(Context,
>>>>>>> attrMDArgs));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >    if (const ReqdWorkGroupSizeAttr *A =
>>>>>>> FD->getAttr<ReqdWorkGroupSizeAttr>()) {
>>>>>>> > > -    llvm::Value *attrMDArgs[] = {
>>>>>>> > > -      llvm::MDString::get(Context, "reqd_work_group_size"),
>>>>>>> > > -      Builder.getInt32(A->getXDim()),
>>>>>>> > > -      Builder.getInt32(A->getYDim()),
>>>>>>> > > -      Builder.getInt32(A->getZDim())
>>>>>>> > > -    };
>>>>>>> > > +    llvm::Metadata *attrMDArgs[] = {
>>>>>>> > > +        llvm::MDString::get(Context, "reqd_work_group_size"),
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(A->getXDim())),
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(A->getYDim())),
>>>>>>> > > +
>>>>>>> llvm::ConstantAsMetadata::get(Builder.getInt32(A->getZDim()))};
>>>>>>> > >      kernelMDArgs.push_back(llvm::MDNode::get(Context,
>>>>>>> attrMDArgs));
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Dec  9 12:39:32
>>>>>>> 2014
>>>>>>> > > @@ -952,29 +952,28 @@ void CodeGenModule::emitLLVMUsed() {
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  void CodeGenModule::AppendLinkerOptions(StringRef Opts) {
>>>>>>> > > -  llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(),
>>>>>>> Opts);
>>>>>>> > > +  auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opts);
>>>>>>> > >
>>>>>>> LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(),
>>>>>>> MDOpts));
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  void CodeGenModule::AddDetectMismatch(StringRef Name, StringRef
>>>>>>> Value) {
>>>>>>> > >    llvm::SmallString<32> Opt;
>>>>>>> > >    getTargetCodeGenInfo().getDetectMismatchOption(Name, Value,
>>>>>>> Opt);
>>>>>>> > > -  llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(),
>>>>>>> Opt);
>>>>>>> > > +  auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
>>>>>>> > >
>>>>>>> LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(),
>>>>>>> MDOpts));
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  void CodeGenModule::AddDependentLib(StringRef Lib) {
>>>>>>> > >    llvm::SmallString<24> Opt;
>>>>>>> > >    getTargetCodeGenInfo().getDependentLibraryOption(Lib, Opt);
>>>>>>> > > -  llvm::Value *MDOpts = llvm::MDString::get(getLLVMContext(),
>>>>>>> Opt);
>>>>>>> > > +  auto *MDOpts = llvm::MDString::get(getLLVMContext(), Opt);
>>>>>>> > >
>>>>>>> LinkerOptionsMetadata.push_back(llvm::MDNode::get(getLLVMContext(),
>>>>>>> MDOpts));
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  /// \brief Add link options implied by the given module,
>>>>>>> including modules
>>>>>>> > >  /// it depends on, using a postorder walk.
>>>>>>> > > -static void addLinkOptionsPostorder(CodeGenModule &CGM,
>>>>>>> > > -                                    Module *Mod,
>>>>>>> > > -                                    SmallVectorImpl<llvm::Value
>>>>>>> *> &Metadata,
>>>>>>> > > +static void addLinkOptionsPostorder(CodeGenModule &CGM, Module
>>>>>>> *Mod,
>>>>>>> > > +
>>>>>>> SmallVectorImpl<llvm::Metadata *> &Metadata,
>>>>>>> > >                                      llvm::SmallPtrSet<Module *,
>>>>>>> 16> &Visited) {
>>>>>>> > >    // Import this module's parent.
>>>>>>> > >    if (Mod->Parent && Visited.insert(Mod->Parent).second) {
>>>>>>> > > @@ -994,10 +993,9 @@ static void addLinkOptionsPostorder(Code
>>>>>>> > >      // Link against a framework.  Frameworks are currently
>>>>>>> Darwin only, so we
>>>>>>> > >      // don't to ask TargetCodeGenInfo for the spelling of the
>>>>>>> linker option.
>>>>>>> > >      if (Mod->LinkLibraries[I-1].IsFramework) {
>>>>>>> > > -      llvm::Value *Args[2] = {
>>>>>>> > > -        llvm::MDString::get(Context, "-framework"),
>>>>>>> > > -        llvm::MDString::get(Context,
>>>>>>> Mod->LinkLibraries[I-1].Library)
>>>>>>> > > -      };
>>>>>>> > > +      llvm::Metadata *Args[2] = {
>>>>>>> > > +          llvm::MDString::get(Context, "-framework"),
>>>>>>> > > +          llvm::MDString::get(Context, Mod->LinkLibraries[I -
>>>>>>> 1].Library)};
>>>>>>> > >
>>>>>>> > >        Metadata.push_back(llvm::MDNode::get(Context, Args));
>>>>>>> > >        continue;
>>>>>>> > > @@ -1007,7 +1005,7 @@ static void addLinkOptionsPostorder(Code
>>>>>>> > >      llvm::SmallString<24> Opt;
>>>>>>> > >      CGM.getTargetCodeGenInfo().getDependentLibraryOption(
>>>>>>> > >        Mod->LinkLibraries[I-1].Library, Opt);
>>>>>>> > > -    llvm::Value *OptString = llvm::MDString::get(Context, Opt);
>>>>>>> > > +    auto *OptString = llvm::MDString::get(Context, Opt);
>>>>>>> > >      Metadata.push_back(llvm::MDNode::get(Context, OptString));
>>>>>>> > >    }
>>>>>>> > >  }
>>>>>>> > > @@ -1060,7 +1058,7 @@ void CodeGenModule::EmitModuleLinkOption
>>>>>>> > >    // Add link options for all of the imported modules in
>>>>>>> reverse topological
>>>>>>> > >    // order.  We don't do anything to try to order import link
>>>>>>> flags with respect
>>>>>>> > >    // to linker options inserted by things like #pragma
>>>>>>> comment().
>>>>>>> > > -  SmallVector<llvm::Value *, 16> MetadataArgs;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> MetadataArgs;
>>>>>>> > >    Visited.clear();
>>>>>>> > >    for (llvm::SetVector<clang::Module *>::iterator M =
>>>>>>> LinkModules.begin(),
>>>>>>> > >                                                 MEnd =
>>>>>>> LinkModules.end();
>>>>>>> > > @@ -3396,10 +3394,9 @@ static void EmitGlobalDeclMetadata(CodeG
>>>>>>> > >
>>>>>>> CGM.getModule().getOrInsertNamedMetadata("clang.global.decl.ptrs");
>>>>>>> > >
>>>>>>> > >    // TODO: should we report variant information for ctors/dtors?
>>>>>>> > > -  llvm::Value *Ops[] = {
>>>>>>> > > -    Addr,
>>>>>>> > > -    GetPointerConstant(CGM.getLLVMContext(), D.getDecl())
>>>>>>> > > -  };
>>>>>>> > > +  llvm::Metadata *Ops[] = {llvm::ConstantAsMetadata::get(Addr),
>>>>>>> > > +
>>>>>>>  llvm::ConstantAsMetadata::get(GetPointerConstant(
>>>>>>> > > +                               CGM.getLLVMContext(),
>>>>>>> D.getDecl()))};
>>>>>>> > >
>>>>>>> GlobalMetadata->addOperand(llvm::MDNode::get(CGM.getLLVMContext(), Ops));
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -3462,7 +3459,9 @@ void CodeGenFunction::EmitDeclMetadata()
>>>>>>> > >      llvm::Value *Addr = I.second;
>>>>>>> > >      if (auto *Alloca = dyn_cast<llvm::AllocaInst>(Addr)) {
>>>>>>> > >        llvm::Value *DAddr = GetPointerConstant(getLLVMContext(),
>>>>>>> D);
>>>>>>> > > -      Alloca->setMetadata(DeclPtrKind,
>>>>>>> llvm::MDNode::get(Context, DAddr));
>>>>>>> > > +      Alloca->setMetadata(
>>>>>>> > > +          DeclPtrKind, llvm::MDNode::get(
>>>>>>> > > +                           Context,
>>>>>>> llvm::ValueAsMetadata::getConstant(DAddr)));
>>>>>>> > >      } else if (auto *GV = dyn_cast<llvm::GlobalValue>(Addr)) {
>>>>>>> > >        GlobalDecl GD = GlobalDecl(cast<VarDecl>(D));
>>>>>>> > >        EmitGlobalDeclMetadata(CGM, GlobalMetadata, GD, GV);
>>>>>>> > > @@ -3476,9 +3475,7 @@ void CodeGenModule::EmitVersionIdentMeta
>>>>>>> > >    std::string Version = getClangFullVersion();
>>>>>>> > >    llvm::LLVMContext &Ctx = TheModule.getContext();
>>>>>>> > >
>>>>>>> > > -  llvm::Value *IdentNode[] = {
>>>>>>> > > -    llvm::MDString::get(Ctx, Version)
>>>>>>> > > -  };
>>>>>>> > > +  llvm::Metadata *IdentNode[] = {llvm::MDString::get(Ctx,
>>>>>>> Version)};
>>>>>>> > >    IdentMetadata->addOperand(llvm::MDNode::get(Ctx, IdentNode));
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > > @@ -3506,9 +3503,8 @@ void CodeGenModule::EmitCoverageFile() {
>>>>>>> > >            llvm::MDString::get(Ctx,
>>>>>>> getCodeGenOpts().CoverageFile);
>>>>>>> > >        for (int i = 0, e = CUNode->getNumOperands(); i != e;
>>>>>>> ++i) {
>>>>>>> > >          llvm::MDNode *CU = CUNode->getOperand(i);
>>>>>>> > > -        llvm::Value *node[] = { CoverageFile, CU };
>>>>>>> > > -        llvm::MDNode *N = llvm::MDNode::get(Ctx, node);
>>>>>>> > > -        GCov->addOperand(N);
>>>>>>> > > +        llvm::Metadata *Elts[] = {CoverageFile, CU};
>>>>>>> > > +        GCov->addOperand(llvm::MDNode::get(Ctx, Elts));
>>>>>>> > >        }
>>>>>>> > >      }
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Tue Dec  9 12:39:32
>>>>>>> 2014
>>>>>>> > > @@ -421,7 +421,7 @@ class CodeGenModule : public CodeGenType
>>>>>>> > >    llvm::SetVector<clang::Module *> ImportedModules;
>>>>>>> > >
>>>>>>> > >    /// \brief A vector of metadata strings.
>>>>>>> > > -  SmallVector<llvm::Value *, 16> LinkerOptionsMetadata;
>>>>>>> > > +  SmallVector<llvm::Metadata *, 16> LinkerOptionsMetadata;
>>>>>>> > >
>>>>>>> > >    /// @name Cache for Objective-C runtime types
>>>>>>> > >    /// @{
>>>>>>> > > @@ -591,9 +591,7 @@ public:
>>>>>>> > >
>>>>>>> > >    llvm::MDNode *getNoObjCARCExceptionsMetadata() {
>>>>>>> > >      if (!NoObjCARCExceptionsMetadata)
>>>>>>> > > -      NoObjCARCExceptionsMetadata =
>>>>>>> > > -        llvm::MDNode::get(getLLVMContext(),
>>>>>>> > > -                          SmallVector<llvm::Value*,1>());
>>>>>>> > > +      NoObjCARCExceptionsMetadata =
>>>>>>> llvm::MDNode::get(getLLVMContext(), None);
>>>>>>> > >      return NoObjCARCExceptionsMetadata;
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > >
>>>>>>> > > Modified: cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp
>>>>>>> > > URL:
>>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp?rev=223803&r1=223802&r2=223803&view=diff
>>>>>>> > >
>>>>>>> ==============================================================================
>>>>>>> > > --- cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp (original)
>>>>>>> > > +++ cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp Tue Dec  9
>>>>>>> 12:39:32 2014
>>>>>>> > > @@ -30,8 +30,8 @@ void SanitizerMetadata::reportGlobalToAS
>>>>>>> > >    IsDynInit &= !CGM.isInSanitizerBlacklist(GV, Loc, Ty, "init");
>>>>>>> > >    IsBlacklisted |= CGM.isInSanitizerBlacklist(GV, Loc, Ty);
>>>>>>> > >
>>>>>>> > > -  llvm::Value *LocDescr = nullptr;
>>>>>>> > > -  llvm::Value *GlobalName = nullptr;
>>>>>>> > > +  llvm::Metadata *LocDescr = nullptr;
>>>>>>> > > +  llvm::Metadata *GlobalName = nullptr;
>>>>>>> > >    llvm::LLVMContext &VMContext = CGM.getLLVMContext();
>>>>>>> > >    if (!IsBlacklisted) {
>>>>>>> > >      // Don't generate source location and global name if it is
>>>>>>> blacklisted -
>>>>>>> > > @@ -41,10 +41,12 @@ void SanitizerMetadata::reportGlobalToAS
>>>>>>> > >        GlobalName = llvm::MDString::get(VMContext, Name);
>>>>>>> > >    }
>>>>>>> > >
>>>>>>> > > -  llvm::Value *GlobalMetadata[] = {
>>>>>>> > > -      GV, LocDescr, GlobalName,
>>>>>>> > > -      llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext),
>>>>>>> IsDynInit),
>>>>>>> > > -      llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext),
>>>>>>> IsBlacklisted)};
>>>>>>> > > +  llvm::Metadata *GlobalMetadata[] = {
>>>>>>> > > +      llvm::ConstantAsMetadata::get(GV), LocDescr, GlobalName,
>>>>>>> > > +      llvm::ConstantAsMetadata::get(
>>>>>>> > > +
>>>>>>> llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), IsDynInit)),
>>>>>>> > > +      llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
>>>>>>> > > +          llvm::Type::getInt1Ty(VMContext), IsBlacklisted))};
>>>>>>> > >
>>>>>>> > >    llvm::MDNode *ThisGlobal = llvm::MDNode::get(VMContext,
>>>>>>> GlobalMetadata);
>>>>>>> > >    llvm::NamedMDNode *AsanGlobals =
>>>>>>> > > @@ -70,9 +72,8 @@ void SanitizerMetadata::disableSanitizer
>>>>>>> > >  }
>>>>>>> > >
>>>>>>> > >  void
>>>>>>> SanitizerMetadata::disableSanitizerForInstruction(llvm::Instruction *I) {
>>>>>>> > > -  I->setMetadata(
>>>>>>> > > -      CGM.getModule().getMDKindID("nosanitize"),
>>>>>>> > > -      llvm::MDNode::get(CGM.getLLVMContext(),
>>>>>>> ArrayRef<llvm::Value *>()));
>>>>>>> > > +  I->setMetadata(CGM.getModule().getMDKindID("nosanitize"),
>>>>>>> > > +                 llvm::MDNode::get(CGM.getLLVMContext(), None));
>>>>>>> > >  }
>>>>>>>
>>>>>> ...
>>>
>>> [ההודעה נחתכה]
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141220/4ffd90e7/attachment.html>


More information about the cfe-commits mailing list