xref: /freebsd/contrib/llvm-project/llvm/lib/Support/InitLLVM.cpp (revision d97d838569232dfad536593ef9ee6bcc366a03f3)
1  //===-- InitLLVM.cpp -----------------------------------------------------===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  
9  #include "llvm/Support/InitLLVM.h"
10  #include "llvm/Support/Error.h"
11  #include "llvm/Support/ManagedStatic.h"
12  #include "llvm/Support/PrettyStackTrace.h"
13  #include "llvm/Support/Process.h"
14  #include "llvm/Support/Signals.h"
15  #include <string>
16  
17  #ifdef _WIN32
18  #include "llvm/Support/Windows/WindowsSupport.h"
19  #endif
20  
21  using namespace llvm;
22  using namespace llvm::sys;
23  
24  InitLLVM::InitLLVM(int &Argc, const char **&Argv,
25                     bool InstallPipeSignalExitHandler)
26      : StackPrinter(Argc, Argv) {
27    if (InstallPipeSignalExitHandler)
28      sys::SetOneShotPipeSignalFunction(sys::DefaultOneShotPipeSignalHandler);
29    sys::PrintStackTraceOnErrorSignal(Argv[0]);
30    install_out_of_memory_new_handler();
31  
32  #ifdef _WIN32
33    // We use UTF-8 as the internal character encoding. On Windows,
34    // arguments passed to main() may not be encoded in UTF-8. In order
35    // to reliably detect encoding of command line arguments, we use an
36    // Windows API to obtain arguments, convert them to UTF-8, and then
37    // write them back to the Argv vector.
38    //
39    // There's probably other way to do the same thing (e.g. using
40    // wmain() instead of main()), but this way seems less intrusive
41    // than that.
42    std::string Banner = std::string(Argv[0]) + ": ";
43    ExitOnError ExitOnErr(Banner);
44  
45    ExitOnErr(errorCodeToError(windows::GetCommandLineArguments(Args, Alloc)));
46  
47    // GetCommandLineArguments doesn't terminate the vector with a
48    // nullptr.  Do it to make it compatible with the real argv.
49    Args.push_back(nullptr);
50  
51    Argc = Args.size() - 1;
52    Argv = Args.data();
53  #endif
54  }
55  
56  InitLLVM::~InitLLVM() { llvm_shutdown(); }
57