Fix PR22750: non-determinism causes assertion failure in DWARF generation
authorDario Domizioli <dario.domizioli@gmail.com>
Tue, 3 Mar 2015 18:40:53 +0000 (18:40 +0000)
committerDario Domizioli <dario.domizioli@gmail.com>
Tue, 3 Mar 2015 18:40:53 +0000 (18:40 +0000)
commit2a6c6e914a0d75699f717b45caefeb86a71116ff
treeceb9fb4067bceb36bc458b1895dc64c409d0aa8f
parentf5e27edc7b838920375583cf20d9023e988e8d14
Fix PR22750: non-determinism causes assertion failure in DWARF generation

The cause of the issue is the interaction of two factors:
1) When generating a DW_TAG_imported_declaration DIE which imports another
   imported declaration, the code in AsmPrinter/DwarfCompileUnit.cpp
   asserts that the second imported declaration must already have a DIE.
2) There is a non-determinism in the order in which imported declarations
   within the same scope are processed.
Because of the non-determinism (2), it is possible that an imported
declaration is processed before another one it depends on, breaking the
assumption in (1).

The source of the non-determinism is that the imported declaration
DIDescriptors are sorted by scope in DwarfDebug::beginModule(); however that
sort is not a stable_sort, therefore the order of the declarations within
the same scope is not preserved. The attached patch changes the std::sort to
a std::stable_sort and it fixes the problem.

Test omitted due to it being non-deterministic and depending on the
implementation of std::sort.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231100 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/AsmPrinter/DwarfDebug.cpp