<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jul 29, 2014 at 8:24 AM, 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=""><div class="h5">On Mon, Jul 28, 2014 at 3:24 PM, Manman Ren <<a href="mailto:manman.ren@gmail.com">manman.ren@gmail.com</a>> wrote:<br>

> Author: mren<br>
> Date: Mon Jul 28 17:24:34 2014<br>
> New Revision: 214133<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=214133&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=214133&view=rev</a><br>
> Log:<br>
> [Debug Info] add DISubroutineType and its creation takes DITypeArray.<br>
><br>
> This is the last patch to unique the type array of a subroutine type.<br>
> This is the paired commit with llvm r214132.<br>
><br>
> Modified:<br>
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-template-member.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=214133&r1=214132&r2=214133&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=214133&r1=214132&r2=214133&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br>
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Jul 28 17:24:34 2014<br>
> @@ -784,7 +784,7 @@ llvm::DIType CGDebugInfo::CreateType(con<br>
>        EltTys.push_back(DBuilder.createUnspecifiedParameter());<br>
>    }<br>
><br>
> -  llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys);<br>
> +  llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);<br>
>    return DBuilder.createSubroutineType(Unit, EltTypeArray);<br>
>  }<br>
><br>
> @@ -986,8 +986,8 @@ CGDebugInfo::getOrCreateMethodType(const<br>
>  llvm::DICompositeType CGDebugInfo::getOrCreateInstanceMethodType(<br>
>      QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile Unit) {<br>
>    // Add "this" pointer.<br>
> -  llvm::DIArray Args = llvm::DICompositeType(<br>
> -      getOrCreateType(QualType(Func, 0), Unit)).getElements();<br>
> +  llvm::DITypeArray Args = llvm::DISubroutineType(<br>
> +      getOrCreateType(QualType(Func, 0), Unit)).getTypeArray();<br>
>    assert (Args.getNumElements() && "Invalid number of arguments!");<br>
><br>
>    SmallVector<llvm::Value *, 16> Elts;<br>
> @@ -1024,7 +1024,7 @@ llvm::DICompositeType CGDebugInfo::getOr<br>
>    for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i)<br>
>      Elts.push_back(Args.getElement(i));<br>
><br>
> -  llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts);<br>
> +  llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);<br>
><br>
>    unsigned Flags = 0;<br>
>    if (Func->getExtProtoInfo().RefQualifier == RQ_LValue)<br>
> @@ -1374,7 +1374,7 @@ llvm::DIType CGDebugInfo::getOrCreateVTa<br>
><br>
>    /* Function type */<br>
>    llvm::Value *STy = getOrCreateType(Context.IntTy, Unit);<br>
> -  llvm::DIArray SElements = DBuilder.getOrCreateArray(STy);<br>
> +  llvm::DITypeArray SElements = DBuilder.getOrCreateTypeArray(STy);<br>
>    llvm::DIType SubTy = DBuilder.createSubroutineType(Unit, SElements);<br>
>    unsigned Size = Context.getTypeSize(Context.VoidPtrTy);<br>
>    llvm::DIType vtbl_ptr_type = DBuilder.createPointerType(SubTy, Size, 0,<br>
> @@ -2392,7 +2392,8 @@ llvm::DICompositeType CGDebugInfo::getOr<br>
>      // llvm::DISubprogram::Verify() would return false, and<br>
>      // subprogram DIE will miss DW_AT_decl_file and<br>
>      // DW_AT_decl_line fields.<br>
> -    return DBuilder.createSubroutineType(F, DBuilder.getOrCreateArray(None));<br>
> +    return DBuilder.createSubroutineType(F,<br>
> +                                         DBuilder.getOrCreateTypeArray(None));<br>
><br>
>    if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D))<br>
>      return getOrCreateMethodType(Method, F);<br>
> @@ -2420,7 +2421,7 @@ llvm::DICompositeType CGDebugInfo::getOr<br>
>      for (const auto *PI : OMethod->params())<br>
>        Elts.push_back(getOrCreateType(PI->getType(), F));<br>
><br>
> -    llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts);<br>
> +    llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(Elts);<br>
>      return DBuilder.createSubroutineType(F, EltTypeArray);<br>
>    }<br>
><br>
> @@ -2434,7 +2435,7 @@ llvm::DICompositeType CGDebugInfo::getOr<br>
>          for (unsigned i = 0, e = FPT->getNumParams(); i != e; ++i)<br>
>            EltTys.push_back(getOrCreateType(FPT->getParamType(i), F));<br>
>        EltTys.push_back(DBuilder.createUnspecifiedParameter());<br>
> -      llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys);<br>
> +      llvm::DITypeArray EltTypeArray = DBuilder.getOrCreateTypeArray(EltTys);<br>
>        return DBuilder.createSubroutineType(F, EltTypeArray);<br>
>      }<br>
><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=214133&r1=214132&r2=214133&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp?rev=214133&r1=214132&r2=214133&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 Mon Jul 28 17:24:34 2014<br>
> @@ -20,8 +20,8 @@ inline int add3(int x) {<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]] = {{.*}}, null, metadata !"[[OUTER_FOO_INNER_ID:.*]]"} ; [ DW_TAG_structure_type ] [inner]<br>
<br>
</div></div>FWIW I usually match the metadata value including the ! for<br>
cross-references, like this:<br>
<br>
  metadata [[OUTER_FOO_INNER_ID:!".*"]]<br>
<br>
that way the back reference doesn't need to repeat the !" stuff:<br>
<br>
  metadata [[OUTER_FOO_INNER_ID]]<br>
<br>
And the initial match still has the string bits, which ensure that it<br>
is a string value, not a direct metadata reference.<br>
<br>
Though, given that there's a CHECK line just two lines up that uses<br>
the actual mangled name (at least I assume that's the same name:<br>
"_ZN3foo4funcEN5outerIS_E5innerE") perhaps it'd make more sense just<br>
to use the name directly, rather than a capturing reference?<br></blockquote><div><br></div><div> _ZN3foo4funcEN5outerIS_E5innerE is the mangled name for the subprogram, and here we are checking the mangled name for one of the parameter type,</div>
<div>so they are different.</div><div><br></div><div>Thanks for the post-commit review,</div><div>Manman</div><div><br></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">

<br>
In the frontend you have to be careful not to match the name directly<br>
due to differences in mangling between itanium and Windows, etc - but<br>
that's not the case with this backend test where the mangled name is<br>
already hardcoded in the input.<br>
<div class=""><div class="h5"><br>
> +// CHECK: [[FOO_FUNC_PARAMS]] = metadata !{null, metadata !{{[0-9]*}}, metadata !"[[OUTER_FOO_INNER_ID:.*]]"}<br>
> +// CHECK: !{{[0-9]*}} = {{.*}}, null, metadata !"[[OUTER_FOO_INNER_ID]]"} ; [ DW_TAG_structure_type ] [inner]<br>
><br>
>  // CHECK: metadata [[VIRT_MEM:![0-9]*]], i32 0, metadata !"_ZTS4virtI4elemE", metadata [[VIRT_TEMP_PARAM:![0-9]*]], metadata !"_ZTS4virtI4elemE"} ; [ DW_TAG_structure_type ] [virt<elem>] {{.*}} [def]<br>

>  // CHECK: [[VIRT_TEMP_PARAM]] = metadata !{metadata [[VIRT_T:![0-9]*]]}<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>