Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assertion breaks in llvm when -g is used. #13681

Closed
farcaller opened this issue Apr 22, 2014 · 12 comments
Closed

Assertion breaks in llvm when -g is used. #13681

farcaller opened this issue Apr 22, 2014 · 12 comments
Labels
A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.)

Comments

@farcaller
Copy link
Contributor

On recent rust, compiling the code with -g fails with

Assertion failed: (Ty == resolve(Ty.getRef()) && "type was not uniqued, possible ODR violation."), function getOrCreateTypeDIE, file /Users/farcaller/temp/rust/src/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp, line 984.

Here's the backtrace:

* thread #2: tid = 0x3cc39f, 0x00007fff8bcba866 libsystem_kernel.dylib`__pthread_kill + 10, stop reason = signal SIGABRT
  * frame #0: 0x00007fff8bcba866 libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x00007fff8a9bd35c libsystem_pthread.dylib`pthread_kill + 92
    frame #2: 0x00000001026ff13b librustc-4283bb68-0.11-pre.dylib`raise(sig=6) + 27 at Signals.inc:368
    frame #3: 0x00000001026ff1f2 librustc-4283bb68-0.11-pre.dylib`abort + 18 at Signals.inc:385
    frame #4: 0x00000001026ff1d1 librustc-4283bb68-0.11-pre.dylib`__assert_rtn(func=0x0000000102a4c377, file=0x0000000102a4c1d9, line=984, expr=0x0000000102a4c3b8) + 129 at Signals.inc:381
    frame #5: 0x0000000101ad7dbf librustc-4283bb68-0.11-pre.dylib`llvm::DwarfUnit::getOrCreateTypeDIE(this=0x00000001087b7c20, TyNode=0x000000010650a120) + 303 at DwarfUnit.cpp:983
    frame #6: 0x0000000101adb0b9 librustc-4283bb68-0.11-pre.dylib`llvm::DwarfUnit::addType(this=0x00000001087b7c20, Entity=0x000000010a09a5e0, Ty=DIType at 0x0000000108308618, Attribute=DW_AT_type) + 233 at DwarfUnit.cpp:1053
    frame #7: 0x0000000101ad925d librustc-4283bb68-0.11-pre.dylib`llvm::DwarfUnit::constructTypeDIE(this=0x00000001087b7c20, Buffer=0x000000010a09a5e0, CTy=DICompositeType at 0x0000000108308898) + 461 at DwarfUnit.cpp:1229
    frame #8: 0x0000000101ad806b librustc-4283bb68-0.11-pre.dylib`llvm::DwarfUnit::getOrCreateTypeDIE(this=0x00000001087b7c20, TyNode=0x000000010653fbe0) + 987 at DwarfUnit.cpp:1011
    frame #9: 0x0000000101adb0b9 librustc-4283bb68-0.11-pre.dylib`llvm::DwarfUnit::addType(this=0x00000001087b7c20, Entity=0x000000010a09a4e0, Ty=DIType at 0x00000001083089f8, Attribute=DW_AT_type) + 233 at DwarfUnit.cpp:1053
    frame #10: 0x0000000101ad890e librustc-4283bb68-0.11-pre.dylib`llvm::DwarfUnit::getOrCreateSubprogramDIE(this=0x00000001087b7c20, SP=DISubprogram at 0x0000000108308c40) + 1502 at DwarfUnit.cpp:1507
    frame #11: 0x0000000101a8d258 librustc-4283bb68-0.11-pre.dylib`llvm::DwarfDebug::constructSubprogramDIE(this=0x0000000109804200, TheCU=0x00000001087b7c20, N=0x0000000106459a40) + 152 at DwarfDebug.cpp:767
    frame #12: 0x0000000101a89b48 librustc-4283bb68-0.11-pre.dylib`llvm::DwarfDebug::beginModule(this=0x0000000109804200) + 1400 at DwarfDebug.cpp:852
    frame #13: 0x0000000101a89510 librustc-4283bb68-0.11-pre.dylib`DwarfDebug(this=0x0000000109804200, A=0x00000001087d8c20, M=0x0000000108704a10) + 1776 at DwarfDebug.cpp:218
    frame #14: 0x0000000101a88e15 librustc-4283bb68-0.11-pre.dylib`DwarfDebug(this=0x0000000109804200, A=0x00000001087d8c20, M=0x0000000108704a10) + 37 at DwarfDebug.cpp:220
    frame #15: 0x0000000101a506f3 librustc-4283bb68-0.11-pre.dylib`llvm::AsmPrinter::doInitialization(this=0x00000001087d8c20, M=0x0000000108704a10) + 1811 at AsmPrinter.cpp:231
    frame #16: 0x000000010262a3c3 librustc-4283bb68-0.11-pre.dylib`llvm::FPPassManager::doInitialization(this=0x000000010a020170, M=0x0000000108704a10) + 99 at LegacyPassManager.cpp:1564
    frame #17: 0x000000010262ab78 librustc-4283bb68-0.11-pre.dylib`(anonymous namespace)::MPPassManager::runOnModule(this=0x000000010645f630, M=0x0000000108704a10) + 1000 at LegacyPassManager.cpp:1598
    frame #18: 0x000000010262a5ce librustc-4283bb68-0.11-pre.dylib`llvm::legacy::PassManagerImpl::run(this=0x00000001064949d0, M=0x0000000108704a10) + 302 at LegacyPassManager.cpp:1720
    frame #19: 0x000000010262b491 librustc-4283bb68-0.11-pre.dylib`llvm::legacy::PassManager::run(this=0x000000010a0925a0, M=0x0000000108704a10) + 33 at LegacyPassManager.cpp:1755
    frame #20: 0x00000001010aef80 librustc-4283bb68-0.11-pre.dylib`LLVMRustWriteOutputFile(Target=0x0000000109827600, PMR=0x000000010a0925a0, M=0x0000000108704a10, path=0x000000010a00c5b0, FileType=CGFT_ObjectFile) + 832 at PassWrapper.cpp:187
    frame #21: 0x0000000100e86d6f librustc-4283bb68-0.11-pre.dylib`back::link::WriteOutputFile::closure.83915 + 127
    frame #22: 0x000000010025f5b8 librustc-4283bb68-0.11-pre.dylib`c_str::CString::with_ref::h67bfc77600f111fdg0v::v0.11.pre + 152
    frame #23: 0x0000000100e86cb0 librustc-4283bb68-0.11-pre.dylib`c_str::ToCStr::with_c_str::h649f3d0125be42b1V9P::v0.11.pre + 112
    frame #24: 0x0000000100e86c25 librustc-4283bb68-0.11-pre.dylib`back::link::WriteOutputFile::h613b65c16e8d30bcUv1::v0.11.pre + 165
    frame #25: 0x0000000100e8cdd7 librustc-4283bb68-0.11-pre.dylib`back::link::write::run_passes::closure.83984 + 103
    frame #26: 0x0000000100e8c8fc librustc-4283bb68-0.11-pre.dylib`back::link::write::run_passes::with_codegen::hf1bba93ca8ea702anI1::v0.11.pre + 156
    frame #27: 0x0000000100e8ccd5 librustc-4283bb68-0.11-pre.dylib`back::link::write::run_passes::closure.83982 + 229
    frame #28: 0x00000001008e2715 librustc-4283bb68-0.11-pre.dylib`util::common::time::hd17fee6f98ebc873VZh::v0.11.pre + 101
    frame #29: 0x0000000100e88206 librustc-4283bb68-0.11-pre.dylib`back::link::write::run_passes::h7c53c9fff7a4a3569x1::v0.11.pre + 4918
    frame #30: 0x00000001010235e3 librustc-4283bb68-0.11-pre.dylib`driver::driver::phase_5_run_llvm_passes::closure.90380 + 147
    frame #31: 0x00000001008e2715 librustc-4283bb68-0.11-pre.dylib`util::common::time::hd17fee6f98ebc873VZh::v0.11.pre + 101
    frame #32: 0x00000001010234b8 librustc-4283bb68-0.11-pre.dylib`driver::driver::phase_5_run_llvm_passes::h992d8bb755f4d822yVf::v0.11.pre + 520
    frame #33: 0x0000000101028b93 librustc-4283bb68-0.11-pre.dylib`driver::driver::compile_input::h9c6393b1dbe53bc1xag::v0.11.pre + 3875
    frame #34: 0x0000000101077ea4 librustc-4283bb68-0.11-pre.dylib`run_compiler::hadccb7a29096a1ab4Gn::v0.11.pre + 8020
    frame #35: 0x00000001010a90d6 librustc-4283bb68-0.11-pre.dylib`main_args::closure.92321 + 86
    frame #36: 0x00000001010a466a librustc-4283bb68-0.11-pre.dylib`monitor::closure.92199 + 234
    frame #37: 0x00000001010967a4 librustc-4283bb68-0.11-pre.dylib`task::TaskBuilder::try::closure.91965 + 68
    frame #38: 0x000000010007e394 libnative-83574243-0.11-pre.dylib`task::spawn_opts::closure.7781 + 68
    frame #39: 0x0000000105d29a6c libstd-aad93cea-0.11-pre.dylib`unstable::finally::_$x7c$x7c.$x20$x27a$x20.$GT$$x20T.Finally$LT$T$GT$::finally::closure.40007 + 76
    frame #40: 0x0000000105d29949 libstd-aad93cea-0.11-pre.dylib`unstable::finally::try_finally::h7b5dce0c97463d98wMT::v0.11.pre + 89
    frame #41: 0x0000000105d298e2 libstd-aad93cea-0.11-pre.dylib`unstable::finally::_$x7c$x7c.$x20$x27a$x20.$GT$$x20T.Finally$LT$T$GT$::finally::he3252c2706ad38fecLT::v0.11.pre + 130
    frame #42: 0x0000000105d2984d libstd-aad93cea-0.11-pre.dylib`rt::task::Task::run::closure.40002 + 77
    frame #43: 0x0000000105d33b72 libstd-aad93cea-0.11-pre.dylib`rt::unwind::Unwinder::try::try_fn::__rust_abi + 98
    frame #44: 0x0000000105d33a32 libstd-aad93cea-0.11-pre.dylib`rt::unwind::Unwinder::try::try_fn::h1832ab126c831274z09::v0.11.pre + 66
    frame #45: 0x0000000105d419fc libstd-aad93cea-0.11-pre.dylib`rust_try + 12
    frame #46: 0x0000000105d2a378 libstd-aad93cea-0.11-pre.dylib`rt::unwind::Unwinder::try::h476c3fb682ff096aHY9::v0.11.pre + 120
    frame #47: 0x0000000105d296dc libstd-aad93cea-0.11-pre.dylib`rt::task::Task::run::h8de48cc50f018c3cS37::v0.11.pre + 220
    frame #48: 0x000000010007e155 libnative-83574243-0.11-pre.dylib`task::spawn_opts::closure.7753 + 485
    frame #49: 0x0000000105d308e3 libstd-aad93cea-0.11-pre.dylib`rt::thread::thread_start::__rust_abi + 99
    frame #50: 0x0000000105d30875 libstd-aad93cea-0.11-pre.dylib`rt::thread::thread_start::hc37897b3c1d0bcbfDI8::v0.11.pre + 21
    frame #51: 0x00007fff8a9bc899 libsystem_pthread.dylib`_pthread_body + 138
    frame #52: 0x00007fff8a9bc72a libsystem_pthread.dylib`_pthread_start + 137

Unfortunately, I cannot provide a small demo code to reproduce this (can reproduce only on the big project).

@jdm
Copy link
Contributor

jdm commented Apr 22, 2014

A link to the bigger project would help. There's not much to go on here.

@farcaller
Copy link
Contributor Author

I just got the project approved so you can reproduce the bug now.

The code is at https://github.com/hackndev/zinc, uncomment -g line at support/rake.rb line 54 and build with

rake PLATFORM=lpc17xx APP=app_mbed_lcd

@farcaller
Copy link
Contributor Author

A bit more context, it fails here:

DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
  if (!TyNode)
    return NULL;

  DIType Ty(TyNode);
  assert(Ty.isType());
  assert(Ty == resolve(Ty.getRef()) &&
         "type was not uniqued, possible ODR violation.");

where Ty.getName() == (u8,&hal::lpc17xx::pin::reg::PINSEL), that is supposedly defined here.

@huonw
Copy link
Member

huonw commented Apr 30, 2014

cc @michaelwoerister

@sruggier
Copy link

I just hit this today. Here's a minimal set of files that will trigger the issue. I used delta and a bit of massaging to strip all the flavor out of them:
https://gist.github.com/sruggier/79ea3c87ea843a52d716

@farcaller I found that both -g and -Z lto were required to repro this. If you need to debug your code, you can temporarily disable lto and hopefully your project will build.

@michaelwoerister
Copy link
Member

Thanks for providing a small test case, @sruggier, that's very helpful!
I'll set aside some time to take a look at this tomorrow.

@michaelwoerister
Copy link
Member

So, this is a problem with unique type ids not being so unique when bitcode from different crates gets mixed together, as is the case with link-time-optimization. I'll work on a fix over the next days.

@farcaller
Copy link
Contributor Author

And it's broken again:

Assertion failed: (ScopeDIE), function constructAbstractSubprogramScopeDIE, file /Users/rustbuild/src/rust-buildbot/slave/nightly-mac/build/src/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp, line 534.

farcaller added a commit to farcaller/zinc that referenced this issue Jun 16, 2014
farcaller added a commit to farcaller/zinc that referenced this issue Jun 16, 2014
@michaelwoerister
Copy link
Member

And it's broken again

This seems to be a different issue. Feel free to open a new bug, preferable with a title specific to the assertion happening :)

@farcaller
Copy link
Contributor Author

Sure, opened #14930

@iopq
Copy link

iopq commented Nov 8, 2015

I get Assertion failed: Ty == resolve(Ty->getRef()) && "type was not uniqued, possible ODR violation.", file C:\bot\slave\nightly-dist-rustc-win-msvc-64\build\src\llvm\lib\CodeGen\AsmPrinter\DwarfUnit.cpp, line 713 when trying to compile with debug and LTO at the same time

is this the same issue?

@jdm
Copy link
Contributor

jdm commented Nov 8, 2015

@iopq It's been long enough that it's worth filing separately, I think.

bors added a commit to rust-lang-ci/rust that referenced this issue Jan 9, 2023
…r=Veykril

fix: check tail expressions more precisely in `extract_function`

Fixes rust-lang#13620

When extracting expressions with control flows into a function, we can avoid wrapping tail expressions in `Option` or `Result` when they are also tail expressions of the container we're extracting from (see rust-lang#7840, rust-lang#9773). This is controlled by `ContainerInfo::is_in_tail`, but we've been computing it by checking if the tail expression of the range to extract is contained in the container's syntactically last expression, which may be a block that contains both tail and non-tail expressions (e.g. in rust-lang#13620, the range to be extracted is not a tail expression but we set the flag to true).

This PR tries to compute the flag as precise as possible by utilizing `for_each_tail_expr()` (and also moves the flag to `Function` struct as it's more of a property of the function to be extracted than of the container).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.)
Projects
None yet
Development

No branches or pull requests

6 participants