InitLLVM.cpp revision 360784
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
21using namespace llvm;
22using namespace llvm::sys;
23
24InitLLVM::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
56InitLLVM::~InitLLVM() { llvm_shutdown(); }
57