[llvm-bugs] [Bug 28760] New: [ThinLTO] assert(GS != DefinedGlobals.end()) failed
via llvm-bugs
llvm-bugs at lists.llvm.org
Thu Jul 28 16:05:09 PDT 2016
https://llvm.org/bugs/show_bug.cgi?id=28760
Bug ID: 28760
Summary: [ThinLTO] assert(GS != DefinedGlobals.end()) failed
Product: lld
Version: unspecified
Hardware: PC
OS: All
Status: NEW
Severity: normal
Priority: P
Component: All Bugs
Assignee: unassignedbugs at nondot.org
Reporter: twoh at fb.com
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
Encountered assert(GS != DefinedGlobals.end()) failure while running ThinLTO.
The assertion statement is in MustPreserveGV lambda function in
llvm::thinLTOInternalizeModule (lib/Transforms/IPO/FunctionImport.cpp).
It seems that the assertion fails because it fails to recover the "original
name" of the global value. ModuleSummaryIndex::getOriginalNameBeforePromote
attempts to get the original name by stripping .llvm.{MODHASH}, but what I
observe is that ".1" is still appended to the expected original name.
Then where this extra ".1" comes from? It is appended when the global value is
materialized. IRLinker::materialize function calls
IRLinker::linkGlobalValueProto function, and inside that function if DGV is
nullptr or ShouldLink is true then IRLinker::copyGlobalValueProto function is
called to create a global variable in the destination module that corresponds
to SGV. I found that newly created global variable has the extra ".1" added to
the name of the SGV.
When this thing happens? I don't have a complete understanding about it but I
observed that the same global value is materialized twice during the single
invocation of IRLinker::run function, once with GlobalValueMaterializer and
once with LocalValueMaterializer. First, the global value
; Materializable
; Function Attrs: nounwind uwtable
define weak_odr void @foo(%1*) unnamed_addr #7 comdat($comdat1) align 2
personality i32 (...)* @__gxx_personality_v0 {}
(I renamed the function and comdat)
it materialized with GlobalValueMaterializer, (so the IRLinker::materialize
function is called with ForAlias == false), and the materialized value is
; Function Attrs: nounwind uwtable
declare void @foo(%"type1"*) unnamed_addr #2 align 2
Then, later, the same value is materialized again with LocalValueMaterializer
(so ForAlias == true for IRLinker::materialize), and the materialized value is
; Function Attrs: nounwind uwtable
define internal void @foo.1(%"type 0x7efb6ee89d80"*) unnamed_addr #2
comdat($comdat1) align 2 personality i32 (...)* @__gxx_personality_v0 !dbg
!12345 {
// function definition
}
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160728/092d033a/attachment-0001.html>
More information about the llvm-bugs
mailing list