If a project depends on the Flang runtime and on libc++, linking fails because `std::__libcpp_verbose_abort` is defined in both libraries. Avoid that duplicate definition by defining `_LIBCPP_VERBOSE_ABORT` before including any C++ headers and by renaming that symbol in the Flang runtime to `flang_rt_verbose_abort`. The function that is modified was originally introduced in D158957 to solve an undefined symbol error when linking pure-Fortran projects with the Flang runtime. Providing a definition for that symbol in the Flang runtime might work correctly for ELF or Mach-O if that symbol has weak linkage in libc++. But at least for COFF, this now causes multiple-definition errors for projects that are linking to the Flang runtime and to libc++. The linker errors before this change for Windows/MinGW using Clang+Flang+lld look like this: ``` ld.lld: error: duplicate symbol: std::__1::__libcpp_verbose_abort(char const*, ...) >>> defined at libflang_rt.runtime.a(io-api-minimal.cpp.obj) >>> defined at libc++.dll.a(libc++.dll) ```
23 lines
730 B
C++
23 lines
730 B
C++
//===-- lib/runtime/stl-overrides.cpp ---------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include <cstdarg>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
|
|
// Provide function that is used in place of `std::__libcpp_verbose_abort` to
|
|
// avoid dependency on the symbol provided by libc++.
|
|
void flang_rt_verbose_abort(char const *format, ...) {
|
|
va_list list;
|
|
va_start(list, format);
|
|
std::vfprintf(stderr, format, list);
|
|
va_end(list);
|
|
|
|
std::abort();
|
|
}
|