[llvm] r290322 - Refactor the DIExpression fragment query interface (NFC)
Adrian Prantl via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 21 21:27:12 PST 2016
Author: adrian
Date: Wed Dec 21 23:27:12 2016
New Revision: 290322
URL: http://llvm.org/viewvc/llvm-project?rev=290322&view=rev
Log:
Refactor the DIExpression fragment query interface (NFC)
... so it becomes available to DIExpressionCursor.
Modified:
llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h
llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
llvm/trunk/lib/IR/DebugInfoMetadata.cpp
llvm/trunk/lib/IR/Verifier.cpp
llvm/trunk/lib/Transforms/Scalar/SROA.cpp
llvm/trunk/lib/Transforms/Utils/Local.cpp
Modified: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h (original)
+++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h Wed Dec 21 23:27:12 2016
@@ -1973,15 +1973,6 @@ public:
return Elements[I];
}
- /// Return whether this is a piece of an aggregate variable.
- bool isFragment() const;
-
- /// Return the offset of this fragment in bits.
- uint64_t getFragmentOffsetInBits() const;
-
- /// Return the size of this fragment in bits.
- uint64_t getFragmentSizeInBits() const;
-
/// Determine whether this represents a standalone constant value.
bool isConstant() const;
@@ -2085,6 +2076,24 @@ public:
bool startsWithDeref() const {
return getNumElements() > 0 && getElement(0) == dwarf::DW_OP_deref;
}
+
+ /// Holds the characteristics of one fragment of a larger variable.
+ struct FragmentInfo {
+ uint64_t SizeInBits;
+ uint64_t OffsetInBits;
+ };
+
+ /// Retrieve the details of this fragment expression.
+ static Optional<FragmentInfo> getFragmentInfo(expr_op_iterator Start,
+ expr_op_iterator End);
+
+ /// Retrieve the details of this fragment expression.
+ Optional<FragmentInfo> getFragmentInfo() const {
+ return getFragmentInfo(expr_op_begin(), expr_op_end());
+ }
+
+ /// Return whether this is a piece of an aggregate variable.
+ bool isFragment() const { return getFragmentInfo().hasValue(); }
};
/// Global variables.
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed Dec 21 23:27:12 2016
@@ -713,9 +713,10 @@ static bool emitDebugValueComment(const
OS << V->getName();
const DIExpression *Expr = MI->getDebugExpression();
- if (Expr->isFragment())
- OS << " [fragment offset=" << Expr->getFragmentOffsetInBits()
- << " size=" << Expr->getFragmentSizeInBits() << "]";
+ auto Fragment = Expr->getFragmentInfo();
+ if (Fragment)
+ OS << " [fragment offset=" << Fragment->OffsetInBits
+ << " size=" << Fragment->SizeInBits << "]";
OS << " <- ";
// The second operand is only an offset if it's an immediate.
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Wed Dec 21 23:27:12 2016
@@ -944,9 +944,10 @@ void CodeViewDebug::collectVariableInfo(
unsigned StructOffset = 0;
// Handle fragments.
- if (DIExpr && DIExpr->isFragment()) {
+ auto Fragment = DIExpr->getFragmentInfo();
+ if (DIExpr && Fragment) {
IsSubfield = true;
- StructOffset = DIExpr->getFragmentOffsetInBits() / 8;
+ StructOffset = Fragment->OffsetInBits / 8;
} else if (DIExpr && DIExpr->getNumElements() > 0) {
continue; // Ignore unrecognized exprs.
}
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp Wed Dec 21 23:27:12 2016
@@ -65,10 +65,12 @@ MCSymbol *DebugHandlerBase::getLabelAfte
int DebugHandlerBase::fragmentCmp(const DIExpression *P1,
const DIExpression *P2) {
- unsigned l1 = P1->getFragmentOffsetInBits();
- unsigned l2 = P2->getFragmentOffsetInBits();
- unsigned r1 = l1 + P1->getFragmentSizeInBits();
- unsigned r2 = l2 + P2->getFragmentSizeInBits();
+ auto Fragment1 = *P1->getFragmentInfo();
+ auto Fragment2 = *P2->getFragmentInfo();
+ unsigned l1 = Fragment1.OffsetInBits;
+ unsigned l2 = Fragment2.OffsetInBits;
+ unsigned r1 = l1 + Fragment1.SizeInBits;
+ unsigned r2 = l2 + Fragment2.SizeInBits;
if (r1 <= l2)
return -1;
else if (r2 <= l1)
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h Wed Dec 21 23:27:12 2016
@@ -175,8 +175,8 @@ inline bool operator==(const DebugLocEnt
/// Compare two fragments based on their offset.
inline bool operator<(const DebugLocEntry::Value &A,
const DebugLocEntry::Value &B) {
- return A.getExpression()->getFragmentOffsetInBits() <
- B.getExpression()->getFragmentOffsetInBits();
+ return A.getExpression()->getFragmentInfo()->OffsetInBits <
+ B.getExpression()->getFragmentInfo()->OffsetInBits;
}
}
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Dec 21 23:27:12 2016
@@ -469,10 +469,12 @@ static SmallVectorImpl<DwarfCompileUnit:
sortGlobalExprs(SmallVectorImpl<DwarfCompileUnit::GlobalExpr> &GVEs) {
std::sort(GVEs.begin(), GVEs.end(),
[](DwarfCompileUnit::GlobalExpr A, DwarfCompileUnit::GlobalExpr B) {
- if (A.Expr != B.Expr && A.Expr && B.Expr &&
- A.Expr->isFragment() && B.Expr->isFragment())
- return A.Expr->getFragmentOffsetInBits() <
- B.Expr->getFragmentOffsetInBits();
+ if (A.Expr != B.Expr && A.Expr && B.Expr) {
+ auto FragmentA = A.Expr->getFragmentInfo();
+ auto FragmentB = B.Expr->getFragmentInfo();
+ if (FragmentA && FragmentB)
+ return FragmentA->OffsetInBits < FragmentB->OffsetInBits;
+ }
return false;
});
GVEs.erase(std::unique(GVEs.begin(), GVEs.end(),
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Wed Dec 21 23:27:12 2016
@@ -285,7 +285,7 @@ void DwarfExpression::addFragmentOffset(
if (!Expr || !Expr->isFragment())
return;
- uint64_t FragmentOffset = Expr->getFragmentOffsetInBits();
+ uint64_t FragmentOffset = Expr->getFragmentInfo()->OffsetInBits;
assert(FragmentOffset >= OffsetInBits &&
"overlapping or duplicate fragments");
if (FragmentOffset > OffsetInBits)
Modified: llvm/trunk/lib/IR/DebugInfoMetadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/IR/DebugInfoMetadata.cpp (original)
+++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp Wed Dec 21 23:27:12 2016
@@ -601,22 +601,14 @@ bool DIExpression::isValid() const {
return true;
}
-bool DIExpression::isFragment() const {
- assert(isValid() && "Expected valid expression");
- if (unsigned N = getNumElements())
- if (N >= 3)
- return getElement(N - 3) == dwarf::DW_OP_LLVM_fragment;
- return false;
-}
-
-uint64_t DIExpression::getFragmentOffsetInBits() const {
- assert(isFragment() && "Expected fragment");
- return getElement(getNumElements() - 2);
-}
-
-uint64_t DIExpression::getFragmentSizeInBits() const {
- assert(isFragment() && "Expected fragment");
- return getElement(getNumElements() - 1);
+Optional<DIExpression::FragmentInfo>
+DIExpression::getFragmentInfo(expr_op_iterator Start, expr_op_iterator End) {
+ for (auto I = Start; I != End; ++I)
+ if (I->getOp() == dwarf::DW_OP_LLVM_fragment) {
+ DIExpression::FragmentInfo Info = {I->getArg(1), I->getArg(0)};
+ return Info;
+ }
+ return None;
}
bool DIExpression::isConstant() const {
Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Wed Dec 21 23:27:12 2016
@@ -4344,7 +4344,8 @@ void Verifier::verifyFragmentExpression(
return;
// Nothing to do if this isn't a bit piece expression.
- if (!E->isFragment())
+ auto Fragment = E->getFragmentInfo();
+ if (!Fragment)
return;
// The frontend helps out GDB by emitting the members of local anonymous
@@ -4362,8 +4363,8 @@ void Verifier::verifyFragmentExpression(
if (!VarSize)
return;
- unsigned FragSize = E->getFragmentSizeInBits();
- unsigned FragOffset = E->getFragmentOffsetInBits();
+ unsigned FragSize = Fragment->SizeInBits;
+ unsigned FragOffset = Fragment->OffsetInBits;
AssertDI(FragSize + FragOffset <= VarSize,
"fragment is larger than or outside of variable", &I, V, E);
AssertDI(FragSize != VarSize, "fragment covers entire variable", &I, V, E);
Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Wed Dec 21 23:27:12 2016
@@ -4026,13 +4026,13 @@ bool SROA::splitAlloca(AllocaInst &AI, A
if (Fragment.Size < AllocaSize || Expr->isFragment()) {
// If this alloca is already a scalar replacement of a larger aggregate,
// Fragment.Offset describes the offset inside the scalar.
- uint64_t Offset =
- Expr->isFragment() ? Expr->getFragmentOffsetInBits() : 0;
+ auto ExprFragment = Expr->getFragmentInfo();
+ uint64_t Offset = ExprFragment ? ExprFragment->OffsetInBits : 0;
uint64_t Start = Offset + Fragment.Offset;
uint64_t Size = Fragment.Size;
- if (Expr->isFragment()) {
+ if (ExprFragment) {
uint64_t AbsEnd =
- Expr->getFragmentOffsetInBits() + Expr->getFragmentSizeInBits();
+ ExprFragment->OffsetInBits + ExprFragment->SizeInBits;
if (Start >= AbsEnd)
// No need to describe a SROAed padding.
continue;
Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=290322&r1=290321&r2=290322&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/Local.cpp Wed Dec 21 23:27:12 2016
@@ -1112,9 +1112,10 @@ void llvm::ConvertDebugDeclareToDebugVal
unsigned FragmentOffset = 0;
// If this already is a bit fragment, we drop the bit fragment from the
// expression and record the offset.
- if (DIExpr->isFragment()) {
+ auto Fragment = DIExpr->getFragmentInfo();
+ if (Fragment) {
Ops.append(DIExpr->elements_begin(), DIExpr->elements_end()-3);
- FragmentOffset = DIExpr->getFragmentOffsetInBits();
+ FragmentOffset = Fragment->OffsetInBits;
} else {
Ops.append(DIExpr->elements_begin(), DIExpr->elements_end());
}
More information about the llvm-commits
mailing list