[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