Skip to content
This repository was archived by the owner on Apr 4, 2022. It is now read-only.

Assertion failure when emitting constructors and destructors as aliases #3

Closed
MaggieYingYi opened this issue Dec 12, 2017 · 4 comments

Comments

@MaggieYingYi
Copy link

Compile the following code:

class test {
  test();
};
test::test() {}

using

$ rm clang.db
$ clang -O0 -c -target x86_64-pc-linux-gnu-repo -o test.o test.cpp
$ clang -O0 -c -target x86_64-pc-linux-gnu-repo -o test.o test.cpp

The test.cpp is compiled with clang twice.
The first time success and second time failed with following assert error:

Alias must point to a definition
void (%class.test*)* @_ZN4testC1Ev
fatal error: error in backend: Broken module found, compilation aborted!
@MaggieYingYi MaggieYingYi self-assigned this Dec 12, 2017
@MaggieYingYi
Copy link
Author

Triage:

The issue is caused by the constructor alias and program repository pruning.
The following IR code is generated by the first compilation:

@_ZN4testC1Ev = alias void (%class.test*), void (%class.test*)* @_ZN4testC2Ev

define void @_ZN4testC2Ev(%class.test* %this) unnamed_addr #0 align 2 !repo_ticket !2 {
entry:
  …
}

By default, the constructor alias is enabled by clang option of ‘-mconstructor-aliases’. It emitted the constructor _ZN4testC1Ev as an alias of _ZN4testC2Ev. When compiling the code again, the constructor _ZN4testC2Ev already exist in the database clang.db. The program repository pruning pass converts the constructor _ZN4testC2Ev from definition to declaration as shown below:

@_ZN4testC1Ev = alias void (%class.test*), void (%class.test*)* @_ZN4testC2Ev

declare !repo_ticket !2 void @_ZN4testC2Ev(%class.test*) unnamed_addr #0 align 2

The constructor _ZN4testC1Ev is an alias of a declared constructor _ZN4testC2Ev, which caused the assertion failure: Alias must point to a definition.

@MaggieYingYi
Copy link
Author

Possible Solution:

Short term solution: disable constructor alias for repo target.
Long term solution: support the function alias, which point to a declaration in the module and a definition in the database.

Short term solution:

Change the code in llvm\tools\clang\lib\Driver\ToolChains\Clang.cpp (line 3407).

From:

  if (!RawTriple.isOSDarwin() && !RawTriple.isNVPTX())
    CmdArgs.push_back("-mconstructor-aliases");

To:

  if (!RawTriple.isOSDarwin() && !RawTriple.isNVPTX() &&
      !RawTriple.isOSBinFormatRepo())
    CmdArgs.push_back("-mconstructor-aliases");

@MaggieYingYi
Copy link
Author

A note has been added into the readme file (git commit: c871a1c401f82e833).

paulhuggett referenced this issue in SNSystems/clang-prepo Jan 22, 2018
…nge disables the use of 'constructor aliases' to workaround the repository pruning pass's lack of support for aliases at the moment.
paulhuggett referenced this issue in SNSystems/clang-prepo Jan 26, 2018
@MaggieYingYi MaggieYingYi removed their assignment Feb 21, 2018
@rgal rgal transferred this issue from SNSystems/llvm-prepo Feb 21, 2019
@paulhuggett
Copy link

Closing. The "short term" solution has been with us for a while now. We should revisit implementing support for function aliases later.

rgal pushed a commit that referenced this issue Jun 11, 2020
…t binding

This fixes a failing testcase on Fedora 30 x86_64 (regression Fedora 29->30):

PASS:
./bin/lldb ./lldb-test-build.noindex/functionalities/unwind/noreturn/TestNoreturnUnwind.test_dwarf/a.out -o 'settings set symbols.enable-external-lookup false' -o r -o bt -o quit
  * frame #0: 0x00007ffff7aa6e75 libc.so.6`__GI_raise + 325
    frame #1: 0x00007ffff7a91895 libc.so.6`__GI_abort + 295
    frame #2: 0x0000000000401140 a.out`func_c at main.c:12:2
    frame #3: 0x000000000040113a a.out`func_b at main.c:18:2
    frame #4: 0x0000000000401134 a.out`func_a at main.c:26:2
    frame #5: 0x000000000040112e a.out`main(argc=<unavailable>, argv=<unavailable>) at main.c:32:2
    frame #6: 0x00007ffff7a92f33 libc.so.6`__libc_start_main + 243
    frame #7: 0x000000000040106e a.out`_start + 46

vs.

FAIL - unrecognized abort() function:
./bin/lldb ./lldb-test-build.noindex/functionalities/unwind/noreturn/TestNoreturnUnwind.test_dwarf/a.out -o 'settings set symbols.enable-external-lookup false' -o r -o bt -o quit
  * frame #0: 0x00007ffff7aa6e75 libc.so.6`.annobin_raise.c + 325
    frame #1: 0x00007ffff7a91895 libc.so.6`.annobin_loadmsgcat.c_end.unlikely + 295
    frame #2: 0x0000000000401140 a.out`func_c at main.c:12:2
    frame #3: 0x000000000040113a a.out`func_b at main.c:18:2
    frame #4: 0x0000000000401134 a.out`func_a at main.c:26:2
    frame #5: 0x000000000040112e a.out`main(argc=<unavailable>, argv=<unavailable>) at main.c:32:2
    frame #6: 0x00007ffff7a92f33 libc.so.6`.annobin_libc_start.c + 243
    frame #7: 0x000000000040106e a.out`.annobin_init.c.hot + 46

The extra ELF symbols are there due to Annobin (I did not investigate why this
problem happened specifically since F-30 and not since F-28).

It is due to:

Symbol table '.dynsym' contains 2361 entries:
Valu e          Size Type   Bind   Vis     Name
0000000000022769   5 FUNC   LOCAL  DEFAULT _nl_load_domain.cold
000000000002276e   0 NOTYPE LOCAL  HIDDEN  .annobin_abort.c.unlikely
...
000000000002276e   0 NOTYPE LOCAL  HIDDEN  .annobin_loadmsgcat.c_end.unlikely
...
000000000002276e   0 NOTYPE LOCAL  HIDDEN  .annobin_textdomain.c_end.unlikely
000000000002276e 548 FUNC   GLOBAL DEFAULT abort
000000000002276e 548 FUNC   GLOBAL DEFAULT abort@@GLIBC_2.2.5
000000000002276e 548 FUNC   LOCAL  DEFAULT __GI_abort
0000000000022992   0 NOTYPE LOCAL  HIDDEN  .annobin_abort.c_end.unlikely

GDB has some more complicated preferences between overlapping and/or sharing
address symbols, I have made here so far the most simple fix for this case.

Differential revision: https://reviews.llvm.org/D63540
rgal pushed a commit that referenced this issue Jun 11, 2020
…imizing part.

Summary:
This is the next portion of patches for dsymutil.

Create DwarfEmitter interface to generate all debug info tables.
Put DwarfEmitter into DwarfLinker library and make tools/dsymutil/DwarfStreamer
to be child of DwarfEmitter.

It passes check-all testing. MD5 checksum for clang .dSYM bundle matches
for the dsymutil with/without that patch.

Reviewers: JDevlieghere, friss, dblaikie, aprantl

Reviewed By: JDevlieghere

Subscribers: merge_guards_bot, hiraditya, thegameg, probinson, llvm-commits

Tags: #llvm, #debug-info

Differential Revision: https://reviews.llvm.org/D72476
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants