[llvm] r312197 - Revert "Revert r312139 "Verifier: Verify the correctness of fragment expressions attached to globals.""
Adrian Prantl via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 30 17:07:34 PDT 2017
Author: adrian
Date: Wed Aug 30 17:07:33 2017
New Revision: 312197
URL: http://llvm.org/viewvc/llvm-project?rev=312197&view=rev
Log:
Revert "Revert r312139 "Verifier: Verify the correctness of fragment expressions attached to globals.""
This reverts commit r312182 after fixing PR34390.
Added:
llvm/trunk/test/Verifier/fragment.ll
Modified:
llvm/trunk/lib/IR/Verifier.cpp
Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=312197&r1=312196&r2=312197&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Wed Aug 30 17:07:33 2017
@@ -507,6 +507,10 @@ private:
void verifySiblingFuncletUnwinds();
void verifyFragmentExpression(const DbgInfoIntrinsic &I);
+ template <typename ValueOrMetadata>
+ void verifyFragmentExpression(const DIVariable &V,
+ DIExpression::FragmentInfo Fragment,
+ ValueOrMetadata *Desc);
void verifyFnArgs(const DbgInfoIntrinsic &I);
/// Module-level debug info verification...
@@ -1178,8 +1182,11 @@ void Verifier::visitDIExpression(const D
void Verifier::visitDIGlobalVariableExpression(
const DIGlobalVariableExpression &GVE) {
AssertDI(GVE.getVariable(), "missing variable");
- if (auto *Expr = GVE.getExpression())
+ if (auto *Expr = GVE.getExpression()) {
visitDIExpression(*Expr);
+ if (auto Fragment = Expr->getFragmentInfo())
+ verifyFragmentExpression(*GVE.getVariable(), *Fragment, &GVE);
+ }
}
void Verifier::visitDIObjCProperty(const DIObjCProperty &N) {
@@ -4488,7 +4495,7 @@ void Verifier::visitDbgIntrinsic(StringR
verifyFnArgs(DII);
}
-static uint64_t getVariableSize(const DILocalVariable &V) {
+static uint64_t getVariableSize(const DIVariable &V) {
// Be careful of broken types (checked elsewhere).
const Metadata *RawType = V.getRawType();
while (RawType) {
@@ -4527,7 +4534,7 @@ void Verifier::verifyFragmentExpression(
if (!V || !E || !E->isValid())
return;
- // Nothing to do if this isn't a bit piece expression.
+ // Nothing to do if this isn't a DW_OP_LLVM_fragment expression.
auto Fragment = E->getFragmentInfo();
if (!Fragment)
return;
@@ -4541,17 +4548,24 @@ void Verifier::verifyFragmentExpression(
if (V->isArtificial())
return;
+ verifyFragmentExpression(*V, *Fragment, &I);
+}
+
+template <typename ValueOrMetadata>
+void Verifier::verifyFragmentExpression(const DIVariable &V,
+ DIExpression::FragmentInfo Fragment,
+ ValueOrMetadata *Desc) {
// If there's no size, the type is broken, but that should be checked
// elsewhere.
- uint64_t VarSize = getVariableSize(*V);
+ uint64_t VarSize = getVariableSize(V);
if (!VarSize)
return;
- unsigned FragSize = Fragment->SizeInBits;
- unsigned FragOffset = Fragment->OffsetInBits;
+ 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);
+ "fragment is larger than or outside of variable", Desc, &V);
+ AssertDI(FragSize != VarSize, "fragment covers entire variable", Desc, &V);
}
void Verifier::verifyFnArgs(const DbgInfoIntrinsic &I) {
Added: llvm/trunk/test/Verifier/fragment.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/fragment.ll?rev=312197&view=auto
==============================================================================
--- llvm/trunk/test/Verifier/fragment.ll (added)
+++ llvm/trunk/test/Verifier/fragment.ll Wed Aug 30 17:07:33 2017
@@ -0,0 +1,19 @@
+; RUN: not opt -S <%s 2>&1| FileCheck %s
+
+; CHECK: fragment is larger than or outside of variable
+; CHECK: !DIGlobalVariableExpression(var: ![[VAR:[0-9]+]],
+; CHECK-SAME: expr: !DIExpression(DW_OP_LLVM_fragment, 0, 64))
+; CHECK: ![[VAR]] = !DIGlobalVariable(name: "g"
+
+ at g = common global i32 0, align 4, !dbg !0
+
+!llvm.dbg.cu = !{!1}
+!llvm.module.flags = !{!6, !7}
+
+!0 = !DIGlobalVariableExpression(var: !3, expr: !DIExpression(DW_OP_LLVM_fragment, 0, 64))
+!1 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, emissionKind: FullDebug)
+!2 = !DIFile(filename: "a.c", directory: "/")
+!3 = !DIGlobalVariable(name: "g", scope: !1, file: !2, line: 1, type: !5, isLocal: false, isDefinition: true)
+!5 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!6 = !{i32 2, !"Dwarf Version", i32 4}
+!7 = !{i32 2, !"Debug Info Version", i32 3}
More information about the llvm-commits
mailing list