Skip to content

Commit

Permalink
Fix verifier for GlobalAliases to avoid recursing into global initial…
Browse files Browse the repository at this point in the history
…izers.

The verifier follows GlobalAlias operands so that it can detect cycles of
alias definitions. It was doing this in a way that caused it to also recurse
through initializers for the GlobalValue aliasees, and it would fail when
an initializer refers to a global that is a declaration and not a definition.
This patch causes it to stop recursing when it hits a global definition.
<rdar://problem/17277451>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210734 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
bob-wilson committed Jun 12, 2014
1 parent 9ee3431 commit 2347556
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/IR/Verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,10 @@ void Verifier::visitAliaseeSubExpr(SmallPtrSet<const GlobalAlias *, 4> &Visited,

Assert1(!GA2->mayBeOverridden(), "Alias cannot point to a weak alias",
&GA);
} else {
// Only continue verifying subexpressions of GlobalAliases.
// Do not recurse into global initializers.
return;
}
}

Expand Down
4 changes: 4 additions & 0 deletions test/Verifier/alias.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ declare void @f()
; CHECK: Alias must point to a definition
; CHECK-NEXT: @ga

; References to a global declaration from an initializer are OK.
@gptr = global i32* @g
@gptr_a = alias i32** @gptr
; CHECK-NOT: Alias must point to a definition

@test2_a = alias i32* @test2_b
@test2_b = alias i32* @test2_a
Expand Down

0 comments on commit 2347556

Please sign in to comment.