<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 30, 2017 at 4:04 PM, Adrian Prantl via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: adrian<br>
Date: Wed Aug 30 13:04:17 2017<br>
New Revision: 312165<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=312165&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=312165&view=rev</a><br>
Log:<br>
Refactor DIBuilder::<wbr>createFragmentExpression into a static DIExpression member<br>
<br>
NFC<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/<wbr>DIBuilder.h<br>
    llvm/trunk/include/llvm/IR/<wbr>DebugInfoMetadata.h<br>
    llvm/trunk/lib/CodeGen/<wbr>SelectionDAG/LegalizeTypes.cpp<br>
    llvm/trunk/lib/IR/DIBuilder.<wbr>cpp<br>
    llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp<br>
    llvm/trunk/lib/Transforms/IPO/<wbr>GlobalOpt.cpp<br>
    llvm/trunk/lib/Transforms/<wbr>Scalar/SROA.cpp<br>
<br><br>
<br>
Modified: llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=312165&r1=312164&r2=312165&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp?rev=<wbr>312165&r1=312164&r2=312165&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp (original)<br>
+++ llvm/trunk/lib/IR/<wbr>DebugInfoMetadata.cpp Wed Aug 30 13:04:17 2017<br>
@@ -724,6 +724,34 @@ DIExpression *DIExpression::prepend(cons<br>
   return DIExpression::get(Expr-><wbr>getContext(), Ops);<br>
 }<br>
<br>
+DIExpression *DIExpression::<wbr>createFragmentExpression(const DIExpression *Expr,<br>
+                                                     unsigned OffsetInBits,<br>
+                                                     unsigned SizeInBits) {<br>
+  SmallVector<uint64_t, 8> Ops;<br>
+  // Copy over the expression, but leave off any trailing DW_OP_LLVM_fragment.<br>
+  if (Expr) {<br>
+    for (auto Op : Expr->expr_ops()) {<br>
+      if (Op.getOp() == dwarf::DW_OP_LLVM_fragment) {<br>
+        // Make the new offset point into the existing fragment.<br>
+        uint64_t FragmentOffsetInBits = Op.getArg(0);<br>
+        // Op.getArg(0) is FragmentOffsetInBits.<br>
+        // Op.getArg(1) is FragmentSizeInBits.<br>
+        assert((OffsetInBits + SizeInBits <= Op.getArg(0) + Op.getArg(1)) &&<br>
+               "new fragment outside of original fragment");<br></blockquote><div><br></div><div><br></div><div> Hi, </div><div><br></div><div>I am getting an assert here on an (out of tree) big-endian target where 64-bit variables are splitted on 2 32-bit variables.</div><div>assert where: OffsetInBits=32, SizeInBits=32 and Expr: !DIExpression(DW_OP_LLVM_fragment, 0, 32)</div><div>so 32 + 32 <= 32 is not true.</div><div><br></div><div>I might be wrong but I think the assert is only valid on little endian target?</div><div><br></div><div><br></div><div><br></div></div></div></div>