<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 29, 2013 at 12:56 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">On Thu, Aug 29, 2013 at 11:51 AM, Manman Ren <<a href="mailto:manman.ren@gmail.com">manman.ren@gmail.com</a>> wrote:<br>

> Author: mren<br>
> Date: Thu Aug 29 13:51:51 2013<br>
> New Revision: 189600<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=189600&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=189600&view=rev</a><br>
> Log:<br>
> Debug Info: generate a unique identifier for C++ struct, class, union, and enum.<br>
<br>
</div>We've generally been pre-commit reviewing this, so I'm a little<br>
surprised to see this committed outright - but I'm OK reviewing this<br>
in post-commit (Eric may have other ideas).<br></blockquote><div><br></div><div>In one of your previous replies, you said</div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">With test case updates or the change to use null values for empty</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">
<div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">strings, please go ahead and commit this patch.</span></div><div><br></div><div>I may have misunderstood the patch you meant there.</div><div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class="im"><br>
> We use CXX mangler to generate unique identifier for external C++ struct,<br>
> union, class and enum. Types with unique identifier are added to RetainedTypes<br>
> to make sure they are treated as used even when all uses are replaced with<br>
> the identifiers.<br>
><br>
> A single type can be added to RetainedTypes multiple times. For example, both<br>
> createForwardDecl and createLimitedType can add the same type to RetainedTypes.<br>
> A set is used to avoid duplication when updating AllRetainTypes in DIBuilder.<br>
><br>
> Testing cases are updated to reflect the unique identifier generated for types.<br>
> The order of MDNodes is changed because of retained types and testing cases<br>
> are updated accordingly.<br>
><br>
> Testing case debug-info-uuid.cpp now emits error with Itanium mangler, since<br>
> uuid is not yet handled in Itanium mangler.<br>
<br>
</div>That's fine - I don't see any reason to do the work to make that<br>
happen, so I wouldn't worry about that if I were you.<br>
<div class="im"><br>
> We choose to update RetainedTypes in clang, then at finalize(), we update<br>
> AllRetainTypes in DIBuilder. The other choice is to update AllRetainTypes<br>
> in DIBuilder when creating a DICompositeType with unique identifier. This<br>
> option requires using ValueHandle for AllRetainTypes in DIBuilder since<br>
> the created DICompositeType can be modified later on by setContainingType etc.<br>
<br>
</div>I'd probably have rather seen this change made first so we could then<br>
make DIBuilder retain any type with a specified unique identifier<br>
automatically. Having the caller do this seems rather error-prone.<br></blockquote><div><br></div><div>That (updating RetainedTypes in clang) was in the original patch I sent out. Because of the</div><div>need to use ValueHandle for AllRetainTypes if we go with the DIBuilder route, I thought we agreed</div>
<div>on updating in clang. There may be miscommunication somewhere, if you think I should revert his patch</div><div>and continue discussions, let me know.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div><div class="h5"><br>
><br>
> Modified:<br>
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-artificial-arg.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-class.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-decl-nested.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-enum.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-method.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-static-member.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-template-quals.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-template.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-union-template.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-uuid.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info.cpp<br>
><br>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br>
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -599,6 +599,29 @@ llvm::DIType CGDebugInfo::CreateType(con<br>
>                                 Ty->getPointeeType(), Unit);<br>
>  }<br>
><br>
> +/// In C++ mode, types have linkage, so we can rely on the ODR and<br>
> +/// on their mangled names, if they're external. Otherwise, we append<br>
> +/// the CU's directory and file name.<br>
<br>
</div></div>This comment seems inconsistent with the implementation. The<br>
"otherwise we append the CU's directory and file name" isn't being<br>
done (nor should it be - I agree with the implementation, just not the<br>
comment)<br></blockquote><div>You are right, I need to update the comments here. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div class="im"><br>
> +static void getUniqueTagTypeName(const TagType *Ty, CodeGenModule &CGM,<br>
> +                                 llvm::DICompileUnit TheCU,<br>
> +                                 SmallString<256> &FullName) {<br>
<br>
</div>I'd probably just return a SmallString from the function & rely on<br>
NRVO. Return an empty string on 'failure' paths.<br></blockquote><div>That is reasonable. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div><div class="h5"><br>
> +  // FIXME: ODR should apply to ObjC++ exactly the same wasy it does to C++.<br>
> +  // For now, only apply ODR with C++.<br>
> +  const TagDecl *TD = Ty->getDecl();<br>
> +  if (TheCU.getLanguage() != llvm::dwarf::DW_LANG_C_plus_plus ||<br>
> +      !TD->isExternallyVisible())<br>
> +    return;<br>
> +  // Microsoft Mangler does not have support for mangleCXXRTTIName yet.<br>
> +  if (CGM.getTarget().getCXXABI().isMicrosoft())<br>
> +    return;<br>
> +<br>
> +  // TODO: This is using the RTTI name. Is there a better way to get<br>
> +  // a unique string for a type?<br>
> +  llvm::raw_svector_ostream Out(FullName);<br>
> +  CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(QualType(Ty, 0), Out);<br>
> +  Out.flush();<br>
> +}<br>
> +<br>
>  // Creates a forward declaration for a RecordDecl in the given context.<br>
>  llvm::DICompositeType<br>
>  CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,<br>
> @@ -621,7 +644,14 @@ CGDebugInfo::getOrCreateRecordFwdDecl(co<br>
>    }<br>
><br>
>    // Create the type.<br>
> -  return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line);<br>
> +  SmallString<256> FullName;<br>
> +  getUniqueTagTypeName(Ty, CGM, TheCU, FullName);<br>
> +  if (!FullName.empty()) {<br>
> +    QualType QTy(Ty, 0);<br>
> +    RetainedTypes.push_back(QTy.getAsOpaquePtr());<br>
> +  }<br>
<br>
</div></div>All these "if (!empty()) { retain }" are kind of annoying/repetitive &<br>
would go away if we handled this in DIBuilder.<br>
<div class="im"><br>
> +  return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line, 0, 0, 0,<br>
> +                                    FullName.str());<br>
>  }<br>
><br>
>  // Walk up the context chain and create forward decls for record decls,<br>
> @@ -1884,6 +1914,13 @@ llvm::DIType CGDebugInfo::CreateEnumType<br>
>      Align = CGM.getContext().getTypeAlign(ED->getTypeForDecl());<br>
>    }<br>
><br>
> +  SmallString<256> FullName;<br>
> +  getUniqueTagTypeName(Ty, CGM, TheCU, FullName);<br>
> +  if (!FullName.empty()) {<br>
> +    QualType QTy(Ty, 0);<br>
> +    RetainedTypes.push_back(QTy.getAsOpaquePtr());<br>
> +  }<br>
> +<br>
>    // If this is just a forward declaration, construct an appropriately<br>
>    // marked node and just return it.<br>
>    if (!ED->getDefinition()) {<br>
> @@ -1894,7 +1931,7 @@ llvm::DIType CGDebugInfo::CreateEnumType<br>
>      StringRef EDName = ED->getName();<br>
>      return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_enumeration_type,<br>
>                                        EDName, EDContext, DefUnit, Line, 0,<br>
> -                                      Size, Align);<br>
> +                                      Size, Align, FullName.str());<br>
<br>
</div>You shouldn't need to call "str()" here (& in every other call you've<br>
updated). A SmallString should be implicitly convertible to StringRef.<br></blockquote><div>Got it, I will double check and update accordingly.</div><div><br></div><div>Thanks,</div><div>Manman </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div class=""><div class="h5"><br>
>    }<br>
><br>
>    // Create DIEnumerator elements for each enumerator.<br>
> @@ -1920,7 +1957,7 @@ llvm::DIType CGDebugInfo::CreateEnumType<br>
>    llvm::DIType DbgTy =<br>
>      DBuilder.createEnumerationType(EnumContext, ED->getName(), DefUnit, Line,<br>
>                                     Size, Align, EltArray,<br>
> -                                   ClassTy);<br>
> +                                   ClassTy, FullName.str());<br>
>    return DbgTy;<br>
>  }<br>
><br>
> @@ -2270,20 +2307,28 @@ llvm::DICompositeType CGDebugInfo::Creat<br>
>    uint64_t Align = CGM.getContext().getTypeAlign(Ty);<br>
>    llvm::DICompositeType RealDecl;<br>
><br>
> +  SmallString<256> FullName;<br>
> +  getUniqueTagTypeName(Ty, CGM, TheCU, FullName);<br>
> +  if (!FullName.empty()) {<br>
> +    QualType QTy(Ty, 0);<br>
> +    RetainedTypes.push_back(QTy.getAsOpaquePtr());<br>
> +  }<br>
> +<br>
>    if (RD->isUnion())<br>
>      RealDecl = DBuilder.createUnionType(RDContext, RDName, DefUnit, Line,<br>
> -                                        Size, Align, 0, llvm::DIArray());<br>
> +                                        Size, Align, 0, llvm::DIArray(), 0,<br>
> +                                        FullName.str());<br>
>    else if (RD->isClass()) {<br>
>      // FIXME: This could be a struct type giving a default visibility different<br>
>      // than C++ class type, but needs llvm metadata changes first.<br>
>      RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line,<br>
>                                          Size, Align, 0, 0, llvm::DIType(),<br>
>                                          llvm::DIArray(), llvm::DIType(),<br>
> -                                        llvm::DIArray());<br>
> +                                        llvm::DIArray(), FullName.str());<br>
>    } else<br>
>      RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line,<br>
>                                           Size, Align, 0, llvm::DIType(),<br>
> -                                         llvm::DIArray());<br>
> +                                         llvm::DIArray(), 0, 0, FullName.str());<br>
><br>
>    RegionMap[Ty->getDecl()] = llvm::WeakVH(RealDecl);<br>
>    TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = RealDecl;<br>
> @@ -3290,9 +3335,17 @@ void CGDebugInfo::finalize() {<br>
><br>
>    // We keep our own list of retained types, because we need to look<br>
>    // up the final type in the type cache.<br>
> +  // Both createForwardDecl and createLimitedType can add the same type to<br>
> +  // RetainedTypes. A set is used to avoid duplication.<br>
> +  llvm::SmallPtrSet<void *, 16> RetainSet;<br>
>    for (std::vector<void *>::const_iterator RI = RetainedTypes.begin(),<br>
>           RE = RetainedTypes.end(); RI != RE; ++RI)<br>
> -    DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(TypeCache[*RI])));<br>
> +    if (RetainSet.insert(*RI)) {<br>
> +      llvm::DenseMap<void *, llvm::WeakVH>::iterator it =<br>
> +        TypeCache.find(*RI);<br>
> +      if (it != TypeCache.end() && it->second)<br>
> +        DBuilder.retainType(llvm::DIType(cast<llvm::MDNode>(it->second)));<br>
> +    }<br>
><br>
>    DBuilder.finalize();<br>
>  }<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-artificial-arg.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-artificial-arg.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-artificial-arg.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-artificial-arg.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-artificial-arg.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -22,8 +22,8 @@ int main(int argc, char **argv) {<br>
>    A reallyA (500);<br>
>  }<br>
><br>
> -// CHECK: ![[ARTARG:.*]] = {{.*}} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from A]<br>
>  // CHECK: ![[CLASSTYPE:.*]] = {{.*}} ; [ DW_TAG_class_type ] [A]<br>
> +// CHECK: ![[ARTARG:.*]] = {{.*}} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from A]<br>
>  // CHECK: metadata ![[CLASSTYPE]], {{.*}} ; [ DW_TAG_subprogram ] [line 12] [A]<br>
>  // CHECK: metadata [[FUNCTYPE:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_subroutine_type ]<br>
>  // CHECK: [[FUNCTYPE]] = metadata !{null, metadata ![[ARTARG]], metadata !{{.*}}, metadata !{{.*}}}<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-class.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-class.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-class.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-class.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-class.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -96,33 +96,32 @@ int main(int argc, char **argv) {<br>
>  // CHECK: DW_TAG_class_type ] [B]<br>
>  // CHECK: metadata !"_vptr$B", {{.*}}, i32 64, metadata !{{.*}}} ; [ DW_TAG_member ]<br>
><br>
> -// CHECK: [[C:![0-9]*]] = {{.*}} metadata [[C_MEM:![0-9]*]], i32 0, metadata [[C]], null, null} ; [ DW_TAG_structure_type ] [C] {{.*}} [def]<br>
> +// CHECK: [[C:![0-9]*]] = {{.*}} metadata [[C_MEM:![0-9]*]], i32 0, metadata [[C]], null, metadata !"_ZTS1C"} ; [ DW_TAG_structure_type ] [C] {{.*}} [def]<br>
>  // CHECK: [[C_MEM]] = metadata !{metadata [[C_VPTR:![0-9]*]], metadata [[C_S:![0-9]*]], metadata [[C_DTOR:![0-9]*]]}<br>
>  // CHECK: [[C_VPTR]] = {{.*}} ; [ DW_TAG_member ] [_vptr$C] {{.*}} [artificial]<br>
>  // CHECK: [[C_S]] = {{.*}} ; [ DW_TAG_member ] [s] {{.*}} [static] [from int]<br>
>  // CHECK: [[C_DTOR]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [~C]<br>
><br>
> -// CHECK: ; [ DW_TAG_structure_type ] [A]<br>
> -// CHECK: HdrSize<br>
> -// CHECK: metadata [[D_MEM:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_structure_type ] [D] {{.*}} [decl]<br>
> +// CHECK: ; [ DW_TAG_structure_type ] [I] {{.*}} [def]<br>
> +// CHECK: metadata [[D_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTS1D"} ; [ DW_TAG_structure_type ] [D] {{.*}} [decl]<br>
>  // CHECK: [[D_MEM]] = metadata !{metadata [[D_FUNC:![0-9]*]]}<br>
>  // CHECK: [[D_FUNC]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [func]<br>
> -<br>
> -// CHECK: ; [ DW_TAG_structure_type ] [I] {{.*}} [def]<br>
> -<br>
> -// CHECK: [[F_I_DEF:![0-9]*]] = {{.*}}, metadata [[F_I:![0-9]*]]} ; [ DW_TAG_variable ] [i]<br>
> +// CHECK: null, i32 0, null, null, metadata !"_ZTS1E"} ; [ DW_TAG_structure_type ] [E] {{.*}} [decl]<br>
> +// CHECK: [[F:![0-9]*]] = {{.*}} metadata [[F_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTS1F"} ; [ DW_TAG_structure_type ] [F] {{.*}} [def]<br>
> +// CHECK: [[F_MEM]] = metadata !{metadata [[F_I:![0-9]*]]}<br>
>  // CHECK: [[F_I]] = {{.*}} ; [ DW_TAG_member ] [i]<br>
> -// CHECK: [[F:![0-9]*]] = {{.*}} metadata [[F_MEM:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_structure_type ] [F] {{.*}} [def]<br>
> -// CHECK: [[F_MEM]] = metadata !{metadata [[F_I]]}<br>
><br>
> -// CHECK: null, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [E] {{.*}} [decl]<br>
> -<br>
> -// CHECK: metadata [[G_INNER_MEM:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_structure_type ] [inner] [line 50, {{.*}} [def]<br>
>  // Context chains (in Clang -flimit-debug-info and in GCC generally) contain<br>
>  // definitions without members (& without a vbase 'containing type'):<br>
> -// CHECK: null, i32 0, null, null, null} ; [ DW_TAG_structure_type ] [G] {{.*}} [def]<br>
> +// CHECK: null, i32 0, null, null, metadata !"_ZTS1G"} ; [ DW_TAG_structure_type ] [G] {{.*}} [def]<br>
> +// CHECK: metadata [[G_INNER_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTSN1G5innerE"} ; [ DW_TAG_structure_type ] [inner] [line 50, {{.*}} [def]<br>
>  // CHECK: [[G_INNER_MEM]] = metadata !{metadata [[G_INNER_I:![0-9]*]]}<br>
>  // CHECK: [[G_INNER_I]] = {{.*}} ; [ DW_TAG_member ] [j] {{.*}} [from int]<br>
><br>
> +// CHECK: ; [ DW_TAG_structure_type ] [A]<br>
> +// CHECK: HdrSize<br>
> +<br>
> +// CHECK: [[F_I_DEF:![0-9]*]] = {{.*}}, metadata [[F_I]]} ; [ DW_TAG_variable ] [i]<br>
> +<br>
>  // CHECK: ![[EXCEPTLOC]] = metadata !{i32 84,<br>
>  // CHECK: ![[RETLOC]] = metadata !{i32 83,<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-decl-nested.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-decl-nested.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-decl-nested.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-decl-nested.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-decl-nested.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -35,11 +35,11 @@ class OuterClass1<br>
>    public:<br>
>      InnerClass1();<br>
>    } theInnerClass1;<br>
> -// CHECK1: metadata {{.*}}, metadata ![[DECL:[0-9]+]], metadata {{.*}}, i32 [[@LINE+5]]} ; [ DW_TAG_subprogram ] [line [[@LINE+5]]] [def] [Bar]<br>
> +// CHECK1: [[DECL:[0-9]+]] = {{.*}} ; [ DW_TAG_subprogram ] [line [[@LINE+2]]] [private] [Bar]<br>
> +// CHECK1: metadata {{.*}}, metadata ![[DECL]], metadata {{.*}}, i32 [[@LINE+4]]} ; [ DW_TAG_subprogram ] [line [[@LINE+4]]] [def] [Bar]<br>
>    void Bar(const Foo1 *);<br>
>  };<br>
>  OuterClass1::InnerClass1 OuterClass1::theInnerClass1;<br>
> -// CHECK1: [[DECL]] = {{.*}} ; [ DW_TAG_subprogram ] [line [[@LINE-3]]] [private] [Bar]<br>
>  void OuterClass1::Bar(const Foo1 *meta) { }<br>
><br>
><br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-enum.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-enum.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-enum.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-enum.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-enum.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -4,7 +4,7 @@<br>
>  // CHECK: [[ENUMS]] = metadata !{metadata [[E1:![0-9]*]], metadata [[E2:![0-9]*]], metadata [[E3:![0-9]*]]}<br>
><br>
>  namespace test1 {<br>
> -// CHECK: [[E1]] = metadata !{i32 {{[^,]*}}, {{[^,]*}}, metadata [[TEST1:![0-9]*]], {{.*}}, metadata [[TEST1_ENUMS:![0-9]*]], {{[^,]*}}, null, null, null} ; [ DW_TAG_enumeration_type ] [e]<br>
> +// CHECK: [[E1]] = metadata !{i32 {{[^,]*}}, {{[^,]*}}, metadata [[TEST1:![0-9]*]], {{.*}}, metadata [[TEST1_ENUMS:![0-9]*]], {{[^,]*}}, null, null, metadata !"_ZTSN5test11eE"} ; [ DW_TAG_enumeration_type ] [e]<br>

>  // CHECK: [[TEST1]] = {{.*}} ; [ DW_TAG_namespace ] [test1]<br>
>  // CHECK: [[TEST1_ENUMS]] = metadata !{metadata [[TEST1_E:![0-9]*]]}<br>
>  // CHECK: [[TEST1_E]] = {{.*}}, metadata !"E", i64 0} ; [ DW_TAG_enumerator ] [E :: 0]<br>
> @@ -16,7 +16,7 @@ void foo() {<br>
><br>
>  namespace test2 {<br>
>  // rdar://8195980<br>
> -// CHECK: [[E2]] = metadata !{i32 {{[^,]*}}, {{[^,]*}}, metadata [[TEST2:![0-9]*]], {{.*}}, metadata [[TEST1_ENUMS]], {{[^,]*}}, null, null, null} ; [ DW_TAG_enumeration_type ] [e]<br>
> +// CHECK: [[E2]] = metadata !{i32 {{[^,]*}}, {{[^,]*}}, metadata [[TEST2:![0-9]*]], {{.*}}, metadata [[TEST1_ENUMS]], {{[^,]*}}, null, null, metadata !"_ZTSN5test21eE"} ; [ DW_TAG_enumeration_type ] [e]<br>

>  // CHECK: [[TEST2]] = {{.*}} ; [ DW_TAG_namespace ] [test2]<br>
>  enum e { E };<br>
>  bool func(int i) {<br>
> @@ -25,7 +25,7 @@ bool func(int i) {<br>
>  }<br>
><br>
>  namespace test3 {<br>
> -// CHECK: [[E3]] = metadata !{i32 {{[^,]*}}, {{[^,]*}}, metadata [[TEST3:![0-9]*]], {{.*}}, metadata [[TEST3_ENUMS:![0-9]*]], {{[^,]*}}, null, null, null} ; [ DW_TAG_enumeration_type ] [e]<br>
> +// CHECK: [[E3]] = metadata !{i32 {{[^,]*}}, {{[^,]*}}, metadata [[TEST3:![0-9]*]], {{.*}}, metadata [[TEST3_ENUMS:![0-9]*]], {{[^,]*}}, null, null, metadata !"_ZTSN5test31eE"} ; [ DW_TAG_enumeration_type ] [e]<br>

>  // CHECK: [[TEST3]] = {{.*}} ; [ DW_TAG_namespace ] [test3]<br>
>  // CHECK: [[TEST3_ENUMS]] = metadata !{metadata [[TEST3_E:![0-9]*]]}<br>
>  // CHECK: [[TEST3_E]] = {{.*}}, metadata !"E", i64 -1} ; [ DW_TAG_enumerator ] [E :: -1]<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-method.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-method.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-method.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-method.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-method.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -1,6 +1,7 @@<br>
>  // RUN: %clang_cc1 -emit-llvm -std=c++11 -g %s -o - | FileCheck %s<br>
> -// CHECK: ![[THISTYPE:[0-9]+]] = {{.*}} ; [ DW_TAG_pointer_type ] {{.*}} [artificial] [from A]<br>
> +// CHECK: metadata !"_ZTS1A"} ; [ DW_TAG_class_type ] [A]<br>
>  // CHECK: metadata !"_ZN1A3fooEiS_3$_0", {{.*}} [protected]<br>
> +// CHECK: ![[THISTYPE:[0-9]+]] = {{.*}} ; [ DW_TAG_pointer_type ] {{.*}} [artificial] [from A]<br>
>  // CHECK: DW_TAG_ptr_to_member_type<br>
>  // CHECK: {{.*}}metadata ![[MEMFUNTYPE:[0-9]+]], metadata !{{.*}}} ; [ DW_TAG_ptr_to_member_type ] {{.*}} [from ]<br>
>  // CHECK: ![[MEMFUNTYPE]] = {{.*}}metadata ![[MEMFUNARGS:[0-9]+]], i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] {{.*}} [from ]<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-namespace.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -41,9 +41,11 @@ int func(bool b) {<br>
><br>
>  // CHECK: [[CU:![0-9]*]] = {{.*}}[[MODULES:![0-9]*]], metadata !""} ; [ DW_TAG_compile_unit ]<br>
>  // CHECK: [[FILE:![0-9]*]] {{.*}}debug-info-namespace.cpp"<br>
> +// CHECK: [[FOO:![0-9]*]] {{.*}} ; [ DW_TAG_structure_type ] [foo] [line 5, size 0, align 0, offset 0] [decl] [from ]<br>
>  // CHECK: [[FOOCPP:![0-9]*]] = metadata !{metadata !"foo.cpp", {{.*}}<br>
>  // CHECK: [[NS:![0-9]*]] = {{.*}}, metadata [[FILE2:![0-9]*]], metadata [[CTXT:![0-9]*]], {{.*}} ; [ DW_TAG_namespace ] [B] [line 1]<br>
>  // CHECK: [[CTXT]] = {{.*}}, metadata [[FILE]], null, {{.*}} ; [ DW_TAG_namespace ] [A] [line 5]<br>
> +// CHECK: [[BAR:![0-9]*]] {{.*}} ; [ DW_TAG_structure_type ] [bar] [line 6, {{.*}}] [decl] [from ]<br>
>  // CHECK: [[F1:![0-9]*]] {{.*}} ; [ DW_TAG_subprogram ] [line 4] [def] [f1]<br>
>  // CHECK: [[FUNC:![0-9]*]] {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [def] [func]<br>
>  // CHECK: [[FILE2]]} ; [ DW_TAG_file_type ] [{{.*}}foo.cpp]<br>
> @@ -57,9 +59,7 @@ int func(bool b) {<br>
>  // CHECK: [[LEX1]] = metadata !{i32 {{[0-9]*}}, metadata [[FILE2]], metadata [[FUNC]], i32 {{[0-9]*}}, i32 0, i32 {{.*}}} ; [ DW_TAG_lexical_block ]<br>
>  // CHECK: [[M5]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[CTXT]], i32 {{[0-9]*}}} ; [ DW_TAG_imported_module ]<br>
>  // CHECK: [[M6]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[FOO:![0-9]*]], i32 23} ; [ DW_TAG_imported_declaration ]<br>
> -// CHECK: [[FOO]] {{.*}} ; [ DW_TAG_structure_type ] [foo] [line 5, size 0, align 0, offset 0] [decl] [from ]<br>
>  // CHECK: [[M7]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[BAR:![0-9]*]], i32 {{[0-9]*}}} ; [ DW_TAG_imported_declaration ]<br>
> -// CHECK: [[BAR]] {{.*}} ; [ DW_TAG_structure_type ] [bar] [line 6, {{.*}}] [decl] [from ]<br>
>  // CHECK: [[M8]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[F1]], i32 {{[0-9]*}}} ; [ DW_TAG_imported_declaration ]<br>
>  // CHECK: [[M9]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[I]], i32 {{[0-9]*}}} ; [ DW_TAG_imported_declaration ]<br>
>  // CHECK: [[M10]] = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], metadata [[BAZ:![0-9]*]], i32 {{[0-9]*}}} ; [ DW_TAG_imported_declaration ]<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-static-member.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-static-member.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-static-member.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-static-member.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-static-member.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -33,13 +33,15 @@ int main()<br>
>  // why the definition of "a" comes before the declarations while<br>
>  // "b" and "c" come after.<br>
><br>
> -// CHECK: metadata !"a", {{.*}} @_ZN1C1aE, metadata ![[DECL_A:[0-9]+]]} ; [ DW_TAG_variable ] [a] {{.*}} [def]<br>
> -// CHECK: ![[DECL_A]] = metadata {{.*}} [ DW_TAG_member ] [a] [line {{.*}}, size 0, align 0, offset 0] [private] [static]<br>
> +// CHECK: metadata !"_ZTS1X"} ; [ DW_TAG_enumeration_type ] [X]<br>
> +// CHECK: metadata !"_ZTS1C"} ; [ DW_TAG_class_type ] [C]<br>
> +// CHECK: ![[DECL_A:[0-9]+]] = metadata {{.*}} [ DW_TAG_member ] [a] [line {{.*}}, size 0, align 0, offset 0] [private] [static]<br>
>  // CHECK: metadata !"const_a", {{.*}}, i1 true} ; [ DW_TAG_member ] [const_a] [line {{.*}}, size 0, align 0, offset 0] [private] [static]<br>
>  // CHECK: ![[DECL_B:[0-9]+]] {{.*}} metadata !"b", {{.*}} [ DW_TAG_member ] [b] [line {{.*}}, size 0, align 0, offset 0] [protected] [static]<br>
>  // CHECK: metadata !"const_b", {{.*}}, float 0x{{.*}}} ; [ DW_TAG_member ] [const_b] [line {{.*}}, size 0, align 0, offset 0] [protected] [static]<br>
>  // CHECK: ![[DECL_C:[0-9]+]] {{.*}} metadata !"c", {{.*}} [ DW_TAG_member ] [c] [line {{.*}}, size 0, align 0, offset 0] [static]<br>
>  // CHECK: metadata !"const_c", {{.*}} [ DW_TAG_member ] [const_c] [line {{.*}}, size 0, align 0, offset 0] [static]<br>
>  // CHECK: metadata !"x_a", {{.*}} [ DW_TAG_member ] [x_a] {{.*}} [static]<br>
> +// CHECK: metadata !"a", {{.*}} @_ZN1C1aE, metadata ![[DECL_A]]} ; [ DW_TAG_variable ] [a] {{.*}} [def]<br>
>  // CHECK: metadata !"b", {{.*}} @_ZN1C1bE, metadata ![[DECL_B]]} ; [ DW_TAG_variable ] [b] {{.*}} [def]<br>
>  // CHECK: metadata !"c", {{.*}} @_ZN1C1cE, metadata ![[DECL_C]]} ; [ DW_TAG_variable ] [c] {{.*}} [def]<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-template-limit.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -1,8 +1,8 @@<br>
>  // RUN: %clang -flimit-debug-info -emit-llvm -g -S %s -o - | FileCheck %s<br>
><br>
>  // Check that this pointer type is TC<int><br>
> -// CHECK: ![[LINE:[0-9]+]]} ; [ DW_TAG_pointer_type ]{{.*}}[from TC<int>]<br>
> -// CHECK-NEXT: ![[LINE]] ={{.*}}"TC<int>"<br>
> +// CHECK: ![[LINE:[0-9]+]] = {{.*}}"TC<int>"<br>
> +// CHECK: ![[LINE]]} ; [ DW_TAG_pointer_type ]{{.*}}[from TC<int>]<br>
><br>
>  template<typename T><br>
>  class TC {<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -16,9 +16,17 @@ inline int add3(int x) {<br>
>    return MyClass().add<3>(x); // even though add<3> is ODR used, don't emit it since we don't codegen it<br>
>  }<br>
><br>
> -// CHECK: [[C:![0-9]*]] = {{.*}}, metadata [[C_MEM:![0-9]*]], i32 0, metadata [[C]], null, null} ; [ DW_TAG_structure_type ] [MyClass]<br>
> +// CHECK: [[FOO_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTS3foo"} ; [ DW_TAG_structure_type ] [foo]<br>
> +// CHECK: [[FOO_MEM]] = metadata !{metadata [[FOO_FUNC:![0-9]*]]}<br>
> +// CHECK: [[FOO_FUNC]] = {{.*}}, metadata !"_ZN3foo4funcEN5outerIS_E5innerE", i32 {{[0-9]*}}, metadata [[FOO_FUNC_TYPE:![0-9]*]], {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [func]<br>
> +// CHECK: [[FOO_FUNC_TYPE]] = {{.*}}, metadata [[FOO_FUNC_PARAMS:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_subroutine_type ]<br>
> +// CHECK: [[FOO_FUNC_PARAMS]] = metadata !{null, metadata !{{[0-9]*}}, metadata [[OUTER_FOO_INNER:![0-9]*]]}<br>
> +// CHECK: [[OUTER_FOO_INNER]] = {{.*}} ; [ DW_TAG_structure_type ] [inner]<br>
> +<br>
> +// CHECK: [[C:![0-9]*]] = {{.*}}, metadata [[C_MEM:![0-9]*]], i32 0, metadata [[C]], null, metadata !"_ZTS7MyClass"} ; [ DW_TAG_structure_type ] [MyClass]<br>
>  // CHECK: [[C_MEM]] = metadata !{metadata [[C_VPTR:![0-9]*]], metadata [[C_ADD:![0-9]*]], metadata [[C_FUNC:![0-9]*]], metadata [[C_CTOR:![0-9]*]]}<br>
>  // CHECK: [[C_VPTR]] = {{.*}} ; [ DW_TAG_member ] [_vptr$MyClass]<br>
> +<br>
>  // CHECK: [[C_ADD]] = {{.*}} ; [ DW_TAG_subprogram ] [line 4] [add<2>]<br>
>  // CHECK: [[C_FUNC]] = {{.*}} ; [ DW_TAG_subprogram ] [line 7] [func]<br>
>  // CHECK: [[C_CTOR]] = {{.*}} ; [ DW_TAG_subprogram ] [line 0] [MyClass]<br>
> @@ -43,10 +51,4 @@ inline void func() {<br>
><br>
>  outer<foo>::inner x;<br>
><br>
> -// CHECK: metadata [[OUTER_FOO_INNER:![0-9]*]], i32 {{[0-9]*}}, i32 {{[0-9]*}}, %"struct.outer<foo>::inner"* @x, {{.*}} ; [ DW_TAG_variable ] [x]<br>
> -// CHECK: [[OUTER_FOO_INNER]] = {{.*}} ; [ DW_TAG_structure_type ] [inner]<br>
> -// CHECK: [[FOO_MEM:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_structure_type ] [foo]<br>
> -// CHECK: [[FOO_MEM]] = metadata !{metadata [[FOO_FUNC:![0-9]*]]}<br>
> -// CHECK: [[FOO_FUNC]] = {{.*}}, metadata !"_ZN3foo4funcEN5outerIS_E5innerE", i32 {{[0-9]*}}, metadata [[FOO_FUNC_TYPE:![0-9]*]], {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [func]<br>
> -// CHECK: [[FOO_FUNC_TYPE]] = {{.*}}, metadata [[FOO_FUNC_PARAMS:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_subroutine_type ]<br>
> -// CHECK: [[FOO_FUNC_PARAMS]] = metadata !{null, metadata !{{[0-9]*}}, metadata [[OUTER_FOO_INNER]]}<br>
> +// CHECK: metadata [[OUTER_FOO_INNER]], i32 {{[0-9]*}}, i32 {{[0-9]*}}, %"struct.outer<foo>::inner"* @x, {{.*}} ; [ DW_TAG_variable ] [x]<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-quals.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-quals.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-quals.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-template-quals.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-template-quals.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -15,13 +15,13 @@ void foo (const char *c) {<br>
>    str.assign(c, str);<br>
>  }<br>
><br>
> -// CHECK: [[P:.*]] = {{.*}}, metadata [[CON:![0-9]*]]} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ]<br>
> +// CHECK: [[BS:.*]] = {{.*}} ; [ DW_TAG_structure_type ] [basic_string<char>] [line 4, size 8, align 8, offset 0] [def] [from ]<br>
> +// CHECK: [[TYPE:![0-9]*]] = metadata !{i32 {{.*}}, metadata [[ARGS:.*]], i32 0, null, null, null} ; [ DW_TAG_subroutine_type ]<br>
> +// CHECK: [[ARGS]] = metadata !{metadata !{{.*}}, metadata !{{.*}}, metadata [[P:![0-9]*]], metadata [[R:.*]]}<br>
> +// CHECK: [[P]] = {{.*}}, metadata [[CON:![0-9]*]]} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from ]<br>
>  // CHECK: [[CON]] = {{.*}}, metadata [[CH:![0-9]*]]} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from char]<br>
>  // CHECK: [[CH]] = {{.*}} ; [ DW_TAG_base_type ] [char] [line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char]<br>
><br>
> -// CHECK: {{.*}} metadata [[TYPE:![0-9]*]], {{.*}}, metadata !{{[0-9]*}}, metadata !{{[0-9]*}}, i32 8} ; [ DW_TAG_subprogram ] [line 7] [def] [scope 8] [assign]<br>
> -// CHECK: [[TYPE]] = metadata !{i32 {{.*}}, metadata [[ARGS:.*]], i32 0, null, null, null} ; [ DW_TAG_subroutine_type ]<br>
> -// CHECK: [[ARGS]] = metadata !{metadata !{{.*}}, metadata !{{.*}}, metadata [[P]], metadata [[R:.*]]}<br>
> -// CHECK: [[BS:.*]] = {{.*}} ; [ DW_TAG_structure_type ] [basic_string<char>] [line 4, size 8, align 8, offset 0] [def] [from ]<br>
>  // CHECK: [[R]] = {{.*}}, metadata [[CON2:![0-9]*]]} ; [ DW_TAG_reference_type ] [line 0, size 0, align 0, offset 0] [from ]<br>
>  // CHECK: [[CON2]] = {{.*}}, metadata [[BS]]} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from basic_string<char>]<br>
> +// CHECK: {{.*}} metadata [[TYPE]], {{.*}}, metadata !{{[0-9]*}}, metadata !{{[0-9]*}}, i32 8} ; [ DW_TAG_subprogram ] [line 7] [def] [scope 8] [assign]<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-template.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-template.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-template.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -3,10 +3,7 @@<br>
>  // CHECK: [[EMPTY:![0-9]*]] = metadata !{i32 0}<br>
><br>
><br>
> -// CHECK: [[INT:![0-9]*]] = {{.*}} ; [ DW_TAG_base_type ] [int]<br>
> -// CHECK: metadata [[TCNESTED:![0-9]*]], i32 0, i32 1, %"struct.TC<unsigned int, 2, &glb, &foo::e, &foo::f, &func, tmpl_impl, 1, 2, 3>::nested"* @tci, null} ; [ DW_TAG_variable ] [tci]<br>

> -// CHECK: [[TCNESTED]] = metadata !{i32 {{[0-9]*}}, metadata !{{[0-9]*}}, metadata [[TC:![0-9]*]], {{.*}} ; [ DW_TAG_structure_type ] [nested]<br>
> -// CHECK: [[TC]] = {{.*}}, metadata [[TCARGS:![0-9]*]], null} ; [ DW_TAG_structure_type ] [TC<unsigned int, 2, &glb, &foo::e, &foo::f, &func, tmpl_impl, 1, 2, 3>]<br>
> +// CHECK: [[TC:![0-9]*]] = {{.*}}, metadata [[TCARGS:![0-9]*]], metadata !"{{.*}}"} ; [ DW_TAG_structure_type ] [TC<unsigned int, 2, &glb, &foo::e, &foo::f, &func, tmpl_impl, 1, 2, 3>]<br>

>  // CHECK: [[TCARGS]] = metadata !{metadata [[TCARG1:![0-9]*]], metadata [[TCARG2:![0-9]*]], metadata [[TCARG3:![0-9]*]], metadata [[TCARG4:![0-9]*]], metadata [[TCARG5:![0-9]*]], metadata [[TCARG6:![0-9]*]], metadata [[TCARG7:![0-9]*]], metadata [[TCARG8:![0-9]*]]}<br>

>  //<br>
>  // We seem to be missing file/line/col info on template value parameters -<br>
> @@ -15,9 +12,10 @@<br>
>  //<br>
>  // CHECK: [[TCARG1]] = {{.*}}metadata !"T", metadata [[UINT:![0-9]*]], {{.*}} ; [ DW_TAG_template_type_parameter ]<br>
>  // CHECK: [[UINT:![0-9]*]] = {{.*}} ; [ DW_TAG_base_type ] [unsigned int]<br>
> -// CHECK: [[TCARG2]] = {{.*}}metadata !"", metadata [[UINT:![0-9]*]], i32 2, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
> +// CHECK: [[TCARG2]] = {{.*}}metadata !"", metadata [[UINT]], i32 2, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
>  // CHECK: [[TCARG3]] = {{.*}}metadata !"x", metadata [[INTPTR:![0-9]*]], i32* @glb, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
> -// CHECK: [[INTPTR]] = {{.*}}, metadata [[INT]]} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int]<br>
> +// CHECK: [[INTPTR]] = {{.*}}, metadata [[INT:![0-9]*]]} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int]<br>
> +// CHECK: [[INT]] = {{.*}} ; [ DW_TAG_base_type ] [int]<br>
>  // CHECK: [[TCARG4]] = {{.*}}metadata !"a", metadata [[MEMINTPTR:![0-9]*]], i64 8, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
>  // CHECK: [[MEMINTPTR]] = {{.*}}, metadata [[FOO:![0-9]*]]} ; [ DW_TAG_ptr_to_member_type ] {{.*}}[from int]<br>
>  //<br>
> @@ -48,8 +46,8 @@<br>
>  // CHECK: [[TCARG8_3]] = {{.*}}metadata !"", metadata [[INT]], i32 3, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
><br>
><br>
> -// CHECK: metadata [[TCNT:![0-9]*]], i32 0, i32 1, %struct.TC* @tcn, null} ; [ DW_TAG_variable ] [tcn]<br>
> -// CHECK: [[TCNT:![0-9]*]] = {{.*}}, metadata [[TCNARGS:![0-9]*]], null} ; [ DW_TAG_structure_type ] [TC<int, -3, nullptr, nullptr, nullptr, nullptr, tmpl_impl>]<br>
> +// CHECK: [[TCNESTED:![0-9]*]] = metadata !{i32 {{[0-9]*}}, metadata !{{[0-9]*}}, metadata [[TC]], {{.*}} ; [ DW_TAG_structure_type ] [nested]<br>
> +// CHECK: [[TCNT:![0-9]*]] = {{.*}}, metadata [[TCNARGS:![0-9]*]], metadata !"{{.*}}"} ; [ DW_TAG_structure_type ] [TC<int, -3, nullptr, nullptr, nullptr, nullptr, tmpl_impl>]<br>
>  // CHECK: [[TCNARGS]] = metadata !{metadata [[TCNARG1:![0-9]*]], metadata [[TCNARG2:![0-9]*]], metadata [[TCNARG3:![0-9]*]], metadata [[TCNARG4:![0-9]*]], metadata [[TCNARG5:![0-9]*]], metadata [[TCNARG6:![0-9]*]], metadata [[TCARG7:![0-9]*]], metadata [[TCNARG8:![0-9]*]]}<br>

>  // CHECK: [[TCNARG1]] = {{.*}}metadata !"T", metadata [[INT]], {{.*}} ; [ DW_TAG_template_type_parameter ]<br>
>  // CHECK: [[TCNARG2]] = {{.*}}metadata !"", metadata [[INT]], i32 -3, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
> @@ -70,10 +68,14 @@<br>
>  // CHECK: [[TCNARG6]] = {{.*}}metadata !"f", metadata [[FUNPTR]], i8 0, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
>  // CHECK: [[TCNARG8]] = {{.*}}metadata !"Is", null, metadata [[EMPTY]], {{.*}} ; [ DW_TAG_GNU_template_parameter_pack ]<br>
><br>
> -// CHECK: metadata [[PTOARGS:![0-9]*]], null} ; [ DW_TAG_structure_type ] [PaddingAtEndTemplate<&PaddedObj>]<br>
> +// CHECK: metadata [[PTOARGS:![0-9]*]], metadata !"{{.*}}"} ; [ DW_TAG_structure_type ] [PaddingAtEndTemplate<&PaddedObj>]<br>
>  // CHECK: [[PTOARGS]] = metadata !{metadata [[PTOARG1:![0-9]*]]}<br>
>  // CHECK: [[PTOARG1]] = {{.*}}metadata !"", metadata [[CONST_PADDINGATEND_PTR:![0-9]*]], { i32, i8, [3 x i8] }* @PaddedObj, {{.*}} ; [ DW_TAG_template_value_parameter ]<br>
>  // CHECK: [[CONST_PADDINGATEND_PTR]] = {{.*}} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from PaddingAtEnd]<br>
> +<br>
> +// CHECK: metadata [[TCNESTED]], i32 0, i32 1, %"struct.TC<unsigned int, 2, &glb, &foo::e, &foo::f, &func, tmpl_impl, 1, 2, 3>::nested"* @tci, null} ; [ DW_TAG_variable ] [tci]<br>
> +<br>
> +// CHECK: metadata [[TCNT:![0-9]*]], i32 0, i32 1, %struct.TC* @tcn, null} ; [ DW_TAG_variable ] [tcn]<br>
>  struct foo {<br>
>    char pad[8]; // make the member pointer to 'e' a bit more interesting (nonzero)<br>
>    int e;<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-union-template.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-union-template.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-union-template.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-union-template.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-union-template.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -10,6 +10,6 @@ namespace PR15637 {<br>
>    Value<float> f;<br>
>  }<br>
><br>
> -// CHECK: {{.*}}, metadata !"Value<float>", {{.*}}, null, metadata [[TTPARAM:.*]], null} ; [ DW_TAG_union_type ] [Value<float>]<br>
> +// CHECK: {{.*}}, metadata !"Value<float>", {{.*}}, null, metadata [[TTPARAM:.*]], metadata !"_ZTSN7PR156375ValueIfEE"} ; [ DW_TAG_union_type ] [Value<float>]<br>
>  // CHECK: [[TTPARAM]] = metadata !{metadata [[PARAMS:.*]]}<br>
>  // CHECK: [[PARAMS]] = metadata !{{{.*}}metadata !"T",{{.*}}} ; [ DW_TAG_template_type_parameter ]<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-uuid.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-uuid.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-uuid.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-uuid.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-uuid.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -1,5 +1,5 @@<br>
>  // RUN: %clang_cc1 -emit-llvm -fms-extensions -triple=x86_64-pc-win32 -cxx-abi microsoft -g %s -o - -std=c++11 | FileCheck %s<br>
> -// RUN: %clang_cc1 -emit-llvm -fms-extensions -triple=x86_64-unknown-unknown -g %s -o - -std=c++11 | FileCheck %s<br>
> +// RUN: not %clang_cc1 -emit-llvm -fms-extensions -triple=x86_64-unknown-unknown -g %s -std=c++11 2>&1 | FileCheck %s --check-prefix=CHECK-ITANIUM<br>
><br>
>  // CHECK: metadata [[TGIARGS:![0-9]*]], null} ; [ DW_TAG_structure_type ] [tmpl_guid<&__uuidof(uuid)>]<br>
>  // CHECK: [[TGIARGS]] = metadata !{metadata [[TGIARG1:![0-9]*]]}<br>
> @@ -8,6 +8,8 @@<br>
>  // CHECK: [[CONST_GUID]] = {{.*}}, metadata [[GUID:![0-9]*]]} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from _GUID]<br>
>  // CHECK: [[GUID]] = {{.*}} ; [ DW_TAG_structure_type ] [_GUID]<br>
><br>
> +// CHECK-ITANIUM: error: cannot yet mangle expression type CXXUuidofExpr<br>
> +<br>
>  struct _GUID;<br>
>  template <const _GUID *><br>
>  struct tmpl_guid {<br>
><br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info.cpp?rev=189600&r1=189599&r2=189600&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info.cpp?rev=189600&r1=189599&r2=189600&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info.cpp Thu Aug 29 13:51:51 2013<br>
> @@ -77,9 +77,15 @@ foo func(foo f) {<br>
>    return f; // reference 'f' for now because otherwise we hit another bug<br>
>  }<br>
><br>
> +// CHECK: [[FOO:![0-9]*]] = metadata !{i32 {{[0-9]*}}, metadata !{{[0-9]*}}, metadata [[PR14763:![0-9]*]], {{.*}} ; [ DW_TAG_structure_type ] [foo]<br>
> +// CHECK: [[PR14763]] = {{.*}} ; [ DW_TAG_namespace ] [pr14763]<br>
> +// CHECK: [[INCTYPE:![0-9]*]] = {{.*}} ; [ DW_TAG_structure_type ] [incomplete]{{.*}} [decl]<br>
> +// CHECK: metadata [[A_MEM:![0-9]*]], i32 0, null, null, metadata !"_ZTSN7pr162141aE"} ; [ DW_TAG_structure_type ] [a]<br>
> +// CHECK: [[A_MEM]] = metadata !{metadata [[A_I:![0-9]*]]}<br>
> +// CHECK: [[A_I]] = {{.*}} ; [ DW_TAG_member ] [i] {{.*}} [from int]<br>
> +// CHECK: ; [ DW_TAG_structure_type ] [b] {{.*}}[decl]<br>
> +<br>
>  // CHECK: [[FUNC:![0-9]*]] = {{.*}} metadata !"_ZN7pr147634funcENS_3fooE", i32 {{[0-9]*}}, metadata [[FUNC_TYPE:![0-9]*]], {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [def] [func]<br>
> -// CHECK: [[PR14763:![0-9]*]] = {{.*}} ; [ DW_TAG_namespace ] [pr14763]<br>
> -// CHECK: [[FOO:![0-9]*]] = metadata !{i32 {{[0-9]*}}, metadata !{{[0-9]*}}, metadata [[PR14763]], {{.*}} ; [ DW_TAG_structure_type ] [foo]<br>
>  }<br>
><br>
>  namespace pr9608 { // also pr9600<br>
> @@ -87,8 +93,7 @@ struct incomplete;<br>
>  incomplete (*x)[3];<br>
>  // CHECK: metadata [[INCARRAYPTR:![0-9]*]], i32 0, i32 1, [3 x i8]** @_ZN6pr96081xE, null} ; [ DW_TAG_variable ] [x]<br>
>  // CHECK: [[INCARRAYPTR]] = {{.*}}metadata [[INCARRAY:![0-9]*]]} ; [ DW_TAG_pointer_type ]<br>
> -// CHECK: [[INCARRAY]] = {{.*}}metadata [[INCTYPE:![0-9]*]], metadata {{![0-9]*}}, i32 0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 0, align 0, offset 0] [from incomplete]<br>
> -// CHECK: [[INCTYPE]] = {{.*}} ; [ DW_TAG_structure_type ] [incomplete]{{.*}} [decl]<br>
> +// CHECK: [[INCARRAY]] = {{.*}}metadata [[INCTYPE]], metadata {{![0-9]*}}, i32 0, null, null, null} ; [ DW_TAG_array_type ] [line 0, size 0, align 0, offset 0] [from incomplete]<br>
>  }<br>
><br>
>  // For some reason the argument for PR14763 ended up all the way down here<br>
> @@ -112,8 +117,4 @@ void func() {<br>
>    const bt *b_cnst_ptr_inst;<br>
>  }<br>
><br>
> -// CHECK: metadata [[A_MEM:![0-9]*]], i32 0, null, null, null} ; [ DW_TAG_structure_type ] [a]<br>
> -// CHECK: [[A_MEM]] = metadata !{metadata [[A_I:![0-9]*]]}<br>
> -// CHECK: [[A_I]] = {{.*}} ; [ DW_TAG_member ] [i] {{.*}} [from int]<br>
> -// CHECK: ; [ DW_TAG_structure_type ] [b] {{.*}}[decl]<br>
>  }<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br></div></div>