Skip to content

dso_local_equivalent parsing doesn't correctly handle forward references #57815

@petrhosek

Description

@petrhosek

Take this example:

source_filename = "test.ll"

declare void @func()

@const = constant i64 ptrtoint (ptr dso_local_equivalent @func to i64)

This parses correctly, but LLVM tools always canonicalize IR and put variables first, so running this example through opt produces:

source_filename = "test.ll"

@const = constant i64 ptrtoint (ptr dso_local_equivalent @func to i64)

declare void @func()

Now, if we try to run opt again on this output, we get the following failure:

opt: /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3423: bool llvm::LLParser::parseValID(ValID &, PerFunctionState *, Type *): Assertion `GV && "Could not find a corresponding global variable"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /usr/local/google/home/phosek/llvm/llvm-project/build/debug/bin/opt -S
 #0 0x000055ecbe63a3da llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:11
 #1 0x000055ecbe63a4eb PrintStackTraceSignalHandler(void*) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x000055ecbe638d86 llvm::sys::RunSignalHandlers() /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Signals.cpp:103:5
 #3 0x000055ecbe63aac5 SignalHandler(int) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007fdf5f6f1200 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12200)
 #5 0x00007fdf5f3eb8c1 raise ./signal/../sysdeps/unix/sysv/linux/raise.c:50:1
 #6 0x00007fdf5f3d5546 abort ./stdlib/abort.c:81:7
 #7 0x00007fdf5f3d542f get_sysdep_segment_value ./intl/loadmsgcat.c:509:8
 #8 0x00007fdf5f3d542f _nl_load_domain ./intl/loadmsgcat.c:970:34
 #9 0x00007fdf5f3e4242 (/lib/x86_64-linux-gnu/libc.so.6+0x31242)
#10 0x000055ecbd08d5f3 llvm::LLParser::parseValID(llvm::ValID&, llvm::LLParser::PerFunctionState*, llvm::Type*) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3425:10
#11 0x000055ecbd08fa7f llvm::LLParser::parseGlobalValue(llvm::Type*, llvm::Constant*&) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3780:17
#12 0x000055ecbd08bbec llvm::LLParser::parseGlobalTypeAndValue(llvm::Constant*&) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3789:27
#13 0x000055ecbd08d7c0 llvm::LLParser::parseValID(llvm::ValID&, llvm::LLParser::PerFunctionState*, llvm::Type*) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3466:41
#14 0x000055ecbd08fa7f llvm::LLParser::parseGlobalValue(llvm::Type*, llvm::Constant*&) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3780:17
#15 0x000055ecbd0878c3 llvm::LLParser::parseGlobal(std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>> const&, llvm::SMLoc, unsigned int, bool, unsigned int, unsigned int, bool, llvm::GlobalValue::ThreadLocalMode, llvm::GlobalValue::UnnamedAddr) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:1191:9
#16 0x000055ecbd083c78 llvm::LLParser::parseNamedGlobal() /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:669:5
#17 0x000055ecbd0809bd llvm::LLParser::parseTopLevelEntities() /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:394:11
#18 0x000055ecbd0804f7 llvm::LLParser::Run(bool, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:103:10
#19 0x000055ecbd07804f parseAssemblyInto(llvm::MemoryBufferRef, llvm::Module*, llvm::ModuleSummaryIndex*, llvm::SMDiagnostic&, llvm::SlotMapping*, bool, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/Parser.cpp:34:8
#20 0x000055ecbd077e4c llvm::parseAssemblyInto(llvm::MemoryBufferRef, llvm::Module*, llvm::ModuleSummaryIndex*, llvm::SMDiagnostic&, llvm::SlotMapping*, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/Parser.cpp:41:3
#21 0x000055ecbd07816d llvm::parseAssembly(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::SlotMapping*, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/Parser.cpp:52:7
#22 0x000055ecbde3e6d2 llvm::parseIR(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/IRReader/IRReader.cpp:88:10
#23 0x000055ecbde3e91a llvm::parseIRFile(llvm::StringRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/IRReader/IRReader.cpp:102:10
#24 0x000055ecbacf7ab0 main /usr/local/google/home/phosek/llvm/llvm-project/llvm/tools/opt/opt.cpp:604:9
#25 0x00007fdf5f3d681d __libc_start_main ./csu/../csu/libc-start.c:332:16
#26 0x000055ecbacbb919 _start (/usr/local/google/home/phosek/llvm/llvm-project/build/debug/bin/opt+0x4919919)

The issue seems to be that dso_local_equivalent parsing doesn't correctly handle forward references.

cc @PiJoules

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions