llvm / llvm/llvm-project

[flang] crash with `_FortranAioBeginExternalListOutput` bind(C) name

Open
#176,040 4 comments 0 reactions 0 assignees View on GitHub
crash flang:ir
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Redefining of Fortran-runtime routines often leads to segfault, or internal compiler errors.

Considering the following code:
```
subroutine IOBegin() bind(C, name="_FortranAioBeginExternalListOutput")
end subroutine

print *, "a"
end
```

flang gives a Segmentation Fault:
```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0. Program arguments: /cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang -fc1 -triple x86_64-unknown-linux-gnu -S -mrelocation-model pic -pic-level 2 -pic-is-pie -target-cpu x86-64 -mllvm -x86-asm-syntax=intel -vectorize-loops -vectorize-slp -fversion-loops-for-stride -resource-dir /cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/lib/clang/23 -mframe-pointer=none -O3 -o /app/output.s -x f95 /app/example.f90
#0 0x0000000004574148 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x4574148)
#1 0x0000000004571334 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#2 0x00007c8c42442520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#3 0x0000000004cdef67 mlir::Value genDataTransferStmt(Fortran::lower::AbstractConverter&, Fortran::parser::PrintStmt const&) IO.cpp:0:0
#4 0x0000000004a17ef6 void Fortran::common::log2visit::Log2VisitHelper<0ul, 93ul, void, Fortran::common::visitors::visit<(anonymous namespace)::FirConverter::genFIR(Fortran::lower::pft::Evaluation&, bool)::'lambda0'(auto const&)>(auto&&) const::'lambda'(auto)>, std::variant, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference> const&>(Fortran::common::visitors::visit<(anonymous namespace)::FirConverter::genFIR(Fortran::lower::pft::Evaluation&, bool)::'lambda0'(auto const&)>(auto&&) const::'lambda'(auto)>&&, unsigned long, std::variant, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference, Fortran::common::Reference> const&) Bridge.cpp:0:0
#5 0x0000000004a1e9a9 (anonymous namespace)::FirConverter::lowerFunc(Fortran::lower::pft::FunctionLikeUnit&) Bridge.cpp:0:0
#6 0x0000000004a20aa4 Fortran::lower::LoweringBridge::lower(Fortran::parser::Program const&, Fortran::semantics::SemanticsContext const&) (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x4a20aa4)
#7 0x0000000004887cfc Fortran::frontend::CodeGenAction::beginSourceFileAction() (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x4887cfc)
#8 0x00000000045d7b95 Fortran::frontend::FrontendAction::beginSourceFile(Fortran::frontend::CompilerInstance&, Fortran::frontend::FrontendInputFile const&) (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x45d7b95)
#9 0x00000000045c4ddf Fortran::frontend::CompilerInstance::executeAction(Fortran::frontend::FrontendAction&) (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x45c4ddf)
#10 0x00000000045e2d7f Fortran::frontend::executeCompilerInvocation(Fortran::frontend::CompilerInstance*) (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x45e2d7f)
#11 0x00000000027f16f5 fc1_main(llvm::ArrayRef, char const*) (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x27f16f5)
#12 0x0000000002694381 main (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x2694381)
#13 0x00007c8c42429d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#14 0x00007c8c42429e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#15 0x00000000027f01b5 _start (/cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin/flang+0x27f01b5)
flang-23: error: unable to execute command: Segmentation fault (core dumped)
flang-23: error: flang frontend command failed due to signal (use -v to see invocation)
flang version 23.0.0git (https://github.com/llvm/llvm-project.git 7584c280631a90d72e49e3ec5b9f4f1d3609bd98)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /cefs/78/7875cf303f33f8df9ec3e0f3_clang-llvmflang-trunk-20260114/bin
flang-23: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
flang-23: note: diagnostic msg: /tmp/example-96e632
flang-23: note: diagnostic msg: /tmp/example-96e632.sh
flang-23: note: diagnostic msg:

********************
Compiler returned: 254
```

Reproduction is here: https://godbolt.org/z/PjbeYshhY

Another example is defining `_FortranAProgramStart` like:
```fortran
subroutine Start(i) bind(C, name="_FortranAProgramStart")
integer, value :: i
end subroutine Start
end
```

That will give the following message:
```
loc("/app/example.f90":15:1): error: 'llvm.call' op incorrect number of operands (4) for callee (expecting: 1)
error: Lowering to LLVM IR failed
Incorrect number of arguments passed to called function!
call void @_FortranAProgramStart(i32 %0, ptr %1, ptr %2, ptr null)
error: failed to create the LLVM module
Compiler returned: 1
```

None of this should happen.

Contributor guide

Open the contributing guide

Research direction

Start with the Fortran reproducer and the stack frame in IO.cpp, particularly genDataTransferStmt while lowering the PrintStmt. Investigate how the bind(C) name _FortranAioBeginExternalListOutput affects this path, then verify that flang compiles the reproducer without a segmentation fault or internal compiler error.

Written by the indexing model from the issue text.

Assessment

Tech stack
fortran
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.