author | Stefan Teleman <stefan.teleman@oracle.com> |
Wed, 10 Feb 2016 11:54:12 -0800 | |
changeset 5434 | 9f55c805ce9d |
permissions | -rw-r--r-- |
5434
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
1 |
# 21870099 - 128 bytes for a filesystem path is definitely not enough |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
2 |
# 21870283 - llvm::sys::Process::GetArgumentVector should overload for |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
3 |
# std::vector |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
4 |
# For upstream - maybe. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
5 |
--- tools/clang/tools/driver/driver.cpp 2015-09-20 11:19:37.402058833 -0700 |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
6 |
+++ tools/clang/tools/driver/driver.cpp 2015-09-20 17:00:21.850124658 -0700 |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
7 |
@@ -89,21 +89,21 @@ |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
8 |
/// and the following argument. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
9 |
/// |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
10 |
/// 'Ox': Removes all flags matching 'O' or 'O[sz0-9]' and adds 'Ox' |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
11 |
/// at the end of the command line. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
12 |
/// |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
13 |
/// \param OS - The stream to write edit information to. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
14 |
/// \param Args - The vector of command line arguments. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
15 |
/// \param Edit - The override command to perform. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
16 |
/// \param SavedStrings - Set to use for storing string representations. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
17 |
static void ApplyOneQAOverride(raw_ostream &OS, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
18 |
- SmallVectorImpl<const char*> &Args, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
19 |
+ std::vector<const char*> &Args, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
20 |
StringRef Edit, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
21 |
std::set<std::string> &SavedStrings) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
22 |
// This does not need to be efficient. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
23 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
24 |
if (Edit[0] == '^') { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
25 |
const char *Str = |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
26 |
GetStableCStr(SavedStrings, Edit.substr(1)); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
27 |
OS << "### Adding argument " << Str << " at beginning\n"; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
28 |
Args.insert(Args.begin() + 1, Str); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
29 |
} else if (Edit[0] == '+') { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
30 |
@@ -161,21 +161,21 @@ |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
31 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
32 |
OS << "### Adding argument " << Edit << " at end\n"; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
33 |
Args.push_back(GetStableCStr(SavedStrings, '-' + Edit.str())); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
34 |
} else { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
35 |
OS << "### Unrecognized edit: " << Edit << "\n"; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
36 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
37 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
38 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
39 |
/// ApplyQAOverride - Apply a comma separate list of edits to the |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
40 |
/// input argument lists. See ApplyOneQAOverride. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
41 |
-static void ApplyQAOverride(SmallVectorImpl<const char*> &Args, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
42 |
+static void ApplyQAOverride(std::vector<const char*> &Args, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
43 |
const char *OverrideStr, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
44 |
std::set<std::string> &SavedStrings) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
45 |
raw_ostream *OS = &llvm::errs(); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
46 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
47 |
if (OverrideStr[0] == '#') { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
48 |
++OverrideStr; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
49 |
OS = &llvm::nulls(); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
50 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
51 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
52 |
*OS << "### CCC_OVERRIDE_OPTIONS: " << OverrideStr << "\n"; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
53 |
@@ -223,21 +223,21 @@ |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
54 |
{"cl", "--driver-mode=cl"}, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
55 |
{"++", "--driver-mode=g++"}, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
56 |
}; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
57 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
58 |
for (size_t i = 0; i < llvm::array_lengthof(DriverSuffixes); ++i) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
59 |
if (ProgName.endswith(DriverSuffixes[i].Suffix)) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
60 |
return &DriverSuffixes[i]; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
61 |
return nullptr; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
62 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
63 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
64 |
-static void ParseProgName(SmallVectorImpl<const char *> &ArgVector, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
65 |
+static void ParseProgName(std::vector<const char *> &ArgVector, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
66 |
std::set<std::string> &SavedStrings) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
67 |
// Try to infer frontend type and default target from the program name by |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
68 |
// comparing it against DriverSuffixes in order. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
69 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
70 |
// If there is a match, the function tries to identify a target as prefix. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
71 |
// E.g. "x86_64-linux-clang" as interpreted as suffix "clang" with target |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
72 |
// prefix "x86_64-linux". If such a target prefix is found, is gets added via |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
73 |
// -target as implicit first argument. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
74 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
75 |
std::string ProgName =llvm::sys::path::stem(ArgVector[0]); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
76 |
@@ -325,39 +325,40 @@ |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
77 |
// use clang-cl.exe as the prefix to avoid confusion between clang and MSVC. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
78 |
StringRef ExeBasename(llvm::sys::path::filename(Path)); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
79 |
if (ExeBasename.equals_lower("cl.exe")) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
80 |
ExeBasename = "clang-cl.exe"; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
81 |
DiagClient->setPrefix(ExeBasename); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
82 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
83 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
84 |
// This lets us create the DiagnosticsEngine with a properly-filled-out |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
85 |
// DiagnosticOptions instance. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
86 |
static DiagnosticOptions * |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
87 |
-CreateAndPopulateDiagOpts(SmallVectorImpl<const char *> &argv) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
88 |
- auto *DiagOpts = new DiagnosticOptions; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
89 |
+CreateAndPopulateDiagOpts(std::vector<const char *> &argv) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
90 |
+ auto *DiagOpts = new DiagnosticOptions(); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
91 |
std::unique_ptr<OptTable> Opts(createDriverOptTable()); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
92 |
unsigned MissingArgIndex, MissingArgCount; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
93 |
std::unique_ptr<InputArgList> Args(Opts->ParseArgs( |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
94 |
- argv.begin() + 1, argv.end(), MissingArgIndex, MissingArgCount)); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
95 |
+ argv.data() + 1, argv.data() + argv.size(), MissingArgIndex, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
96 |
+ MissingArgCount)); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
97 |
// We ignore MissingArgCount and the return value of ParseDiagnosticArgs. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
98 |
// Any errors that would be diagnosed here will also be diagnosed later, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
99 |
// when the DiagnosticsEngine actually exists. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
100 |
(void) ParseDiagnosticArgs(*DiagOpts, *Args); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
101 |
return DiagOpts; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
102 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
103 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
104 |
-static void SetInstallDir(SmallVectorImpl<const char *> &argv, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
105 |
+static void SetInstallDir(std::vector<const char *> &argv, |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
106 |
Driver &TheDriver) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
107 |
// Attempt to find the original path used to invoke the driver, to determine |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
108 |
// the installed path. We do this manually, because we want to support that |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
109 |
// path being a symlink. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
110 |
- SmallString<128> InstalledPath(argv[0]); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
111 |
+ SmallString<PATH_MAX> InstalledPath(argv[0]); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
112 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
113 |
// Do a PATH lookup, if there are no directory components. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
114 |
if (llvm::sys::path::filename(InstalledPath) == InstalledPath) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
115 |
if (llvm::ErrorOr<std::string> Tmp = llvm::sys::findProgramByName( |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
116 |
llvm::sys::path::filename(InstalledPath.str()))) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
117 |
InstalledPath = *Tmp; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
118 |
llvm::sys::fs::make_absolute(InstalledPath); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
119 |
InstalledPath = llvm::sys::path::parent_path(InstalledPath); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
120 |
if (llvm::sys::fs::exists(InstalledPath.c_str())) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
121 |
TheDriver.setInstalledDir(InstalledPath); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
122 |
@@ -375,24 +376,26 @@ |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
123 |
return 1; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
124 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
125 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
126 |
int main(int argc_, const char **argv_) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
127 |
llvm::sys::PrintStackTraceOnErrorSignal(); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
128 |
llvm::PrettyStackTraceProgram X(argc_, argv_); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
129 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
130 |
if (llvm::sys::Process::FixupStandardFileDescriptors()) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
131 |
return 1; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
132 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
133 |
- SmallVector<const char *, 256> argv; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
134 |
+ std::vector<const char*> argv; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
135 |
llvm::SpecificBumpPtrAllocator<char> ArgAllocator; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
136 |
- std::error_code EC = llvm::sys::Process::GetArgumentVector( |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
137 |
- argv, llvm::makeArrayRef(argv_, argc_), ArgAllocator); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
138 |
+ llvm::ArrayRef<const char*> AAR = llvm::makeArrayRef(argv_, argc_); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
139 |
+ std::error_code EC = |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
140 |
+ llvm::sys::Process::GetArgumentVector(argv, AAR); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
141 |
+ |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
142 |
if (EC) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
143 |
llvm::errs() << "error: couldn't get arguments: " << EC.message() << '\n'; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
144 |
return 1; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
145 |
} |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
146 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
147 |
std::set<std::string> SavedStrings; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
148 |
StringSetSaver Saver(SavedStrings); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
149 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
150 |
// Determines whether we want nullptr markers in argv to indicate response |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
151 |
// files end-of-lines. We only use this for the /LINK driver argument. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
152 |
@@ -459,21 +462,21 @@ |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
153 |
Driver TheDriver(Path, llvm::sys::getDefaultTargetTriple(), Diags); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
154 |
SetInstallDir(argv, TheDriver); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
155 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
156 |
llvm::InitializeAllTargets(); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
157 |
ParseProgName(argv, SavedStrings); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
158 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
159 |
SetBackdoorDriverOutputsFromEnvVars(TheDriver); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
160 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
161 |
std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(argv)); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
162 |
int Res = 0; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
163 |
- SmallVector<std::pair<int, const Command *>, 4> FailingCommands; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
164 |
+ SmallVector<std::pair<int, const Command *>, 8> FailingCommands; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
165 |
if (C.get()) |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
166 |
Res = TheDriver.ExecuteCompilation(*C, FailingCommands); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
167 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
168 |
// Force a crash to test the diagnostics. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
169 |
if (::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH")) { |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
170 |
Diags.Report(diag::err_drv_force_crash) << "FORCE_CLANG_DIAGNOSTICS_CRASH"; |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
171 |
|
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
172 |
// Pretend that every command failed. |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
173 |
FailingCommands.clear(); |
9f55c805ce9d
PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff
changeset
|
174 |
for (const auto &J : C->getJobs()) |