<div dir="ltr">Does the proposed clang change (using 'isTrivial') match MSVC's behavior in these cases?<br><br>Any idea what this information is used for by the debugger? (because it seems /likely/ it uses it for similar things to the PassByValue/Reference stuff - that's something important to a debugger)</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Apr 2, 2018 at 12:42 PM Aaron Smith via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">asmith added a comment.<br>
<br>
I don't think those DWARF flags help in this case but let's check.<br>
Here are the results of changing the flag as suggested and rerunning<br>
the test from <a href="https://reviews.llvm.org/D45123" rel="noreferrer" target="_blank">https://reviews.llvm.org/D45123</a>. We can see that several places that are not<br>
marked as Trivial are marked as PassByValue meaning that we cannot<br>
rely on PassByValue to mean Trivial.<br>
<br>
$ grep ByValue function-options.ll<br>
<br>
// These are not Trivial but they are PassByValue<br>
<br>
!19 = distinct !DICompositeType(tag: DW_TAG_class_type, name:<br>
"BClass", file: !9, line: 10, size: 8, flags: DIFlagTypePassByValue,<br>
elements: !20, identifier: ".?AVBClass@@")<br>
!43 = distinct !DICompositeType(tag: DW_TAG_class_type, name:<br>
"C2Class", file: !9, line: 25, size: 8, flags: DIFlagTypePassByValue,<br>
elements: !44, identifier: ".?AVC2Class@@")<br>
!55 = distinct !DICompositeType(tag: DW_TAG_class_type, name:<br>
"DClass", file: !9, line: 32, size: 8, flags: DIFlagTypePassByValue,<br>
elements: !56, identifier: ".?AVDClass@@")<br>
!107 = distinct !DICompositeType(tag: DW_TAG_structure_type, name:<br>
"BStruct", file: !9, line: 63, size: 8, flags: DIFlagTypePassByValue,<br>
elements: !108, identifier: ".?AUBStruct@@")<br>
<br>
If you look at the corresponding change to clang in <a href="https://reviews.llvm.org/D45124" rel="noreferrer" target="_blank">https://reviews.llvm.org/D45124</a> you will<br>
see that Trivial and PassByValue/Reference are a bit different.<br>
<br>
  if (auto CXXRD = dyn_cast<CXXRecordDecl>(RD)) {<br>
    if (CGM.getCXXABI().getRecordArgABI(CXXRD) == CGCXXABI::RAA_Indirect)<br>
      Flags |= llvm::DINode::FlagTypePassByReference;<br>
    else<br>
      Flags |= llvm::DINode::FlagTypePassByValue;<br>
<br>
    // When emitting codeview, record if a C++ record is trivial type.<br>
    if (CGM.getCodeGenOpts().EmitCodeView) {<br>
      if (CXXRD->isTrivial())<br>
        Flags |= llvm::DINode::FlagTrivial;<br>
    }<br>
  }<br>
<br>
<br>
Repository:<br>
  rL LLVM<br>
<br>
<a href="https://reviews.llvm.org/D45122" rel="noreferrer" target="_blank">https://reviews.llvm.org/D45122</a><br>
<br>
<br>
<br>
</blockquote></div>