mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 04:06:46 +00:00

Normally, this shouldn't happen. It can happen in exceptional circumstances, if the compiled output of a bitcode object file references symbols that weren't listed as undefined in the bitcode object file itself. This can at least happen in the following cases: - A custom SEH personality is set via asm() - Compiler generated calls to builtin helper functions, such as __chkstk, or __rt_sdiv on arm Both of these produce undefined references to symbols after compiling to a regular object file, that aren't visible on the level of the IR object file. This is only an issue if the referenced symbols are provided as LTO objects themselves; loading regular object files after the LTO compilation works fine. Custom SEH personalities are rare, but one CRT startup file in mingw-w64 does this. The referenced pesonality function is usually provided via an import library, but for WinStore targets, a local dummy reimplementation in C is used, which can be an LTO object. Generated calls to builtins is very common, but the builtins aren't usually provided as LTO objects (compiler-rt's builtins explicitly pass -fno-lto when building), and many of the builtins are provided as raw .S assembly files, which don't get built as LTO objects anyway, even if built with -flto. If hitting this unusual, but possible, situation, error out cleanly with a clear message rather than crashing.
49 lines
1.7 KiB
LLVM
49 lines
1.7 KiB
LLVM
; REQUIRES: x86
|
|
|
|
;; A bitcode file can generate undefined references to symbols that weren't
|
|
;; listed as undefined on the bitcode file itself, if there's a reference to
|
|
;; an unexpected personality routine via asm(). If the personality function
|
|
;; is provided as LTO bitcode, the linker would hit an unhandled state.
|
|
|
|
; RUN: rm -rf %t.dir
|
|
; RUN: split-file %s %t.dir
|
|
; RUN: llvm-as %t.dir/main.ll -o %t.main.obj
|
|
; RUN: llvm-as %t.dir/other.ll -o %t.other.obj
|
|
; RUN: llvm-as %t.dir/personality.ll -o %t.personality.obj
|
|
; RUN: llvm-ar rcs %t.personality.lib %t.personality.obj
|
|
|
|
; RUN: env LLD_IN_TEST=1 not lld-link /entry:entry %t.main.obj %t.other.obj %t.personality.lib /out:%t.exe /subsystem:console /opt:lldlto=0 /debug:symtab 2>&1 | FileCheck %s
|
|
|
|
; CHECK: error: LTO object file lto-late-personality.ll.tmp.personality.lib(lto-late-personality.ll.tmp.personality.obj) linked in after doing LTO compilation.
|
|
|
|
;--- main.ll
|
|
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-w64-windows-gnu"
|
|
|
|
define i32 @entry() {
|
|
entry:
|
|
tail call void @other()
|
|
tail call void asm sideeffect ".seh_handler __C_specific_handler, @except\0A", "~{dirflag},~{fpsr},~{flags}"()
|
|
ret i32 0
|
|
}
|
|
|
|
declare dso_local void @other()
|
|
|
|
;--- other.ll
|
|
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-w64-windows-gnu"
|
|
|
|
define dso_local void @other() {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
;--- personality.ll
|
|
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-w64-windows-gnu"
|
|
|
|
define void @__C_specific_handler() {
|
|
entry:
|
|
ret void
|
|
}
|