Skip to content

Commit 767fccd

Browse files
[clang-repl] Pass triple to IncrementalCompilerBuilder as explicit argument
With out-of-process execution the target triple can be different from the one on the host. We need an interface to configure it.
1 parent 5ddc5b8 commit 767fccd

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

clang/include/clang/Interpreter/Interpreter.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,25 @@ class IncrementalCompilerBuilder {
4949
}
5050

5151
// General C++
52-
llvm::Expected<std::unique_ptr<CompilerInstance>> CreateCpp();
52+
llvm::Expected<std::unique_ptr<CompilerInstance>> CreateCpp(llvm::Triple TT);
5353

5454
// Offload options
5555
void SetOffloadArch(llvm::StringRef Arch) { OffloadArch = Arch; };
5656

5757
// CUDA specific
5858
void SetCudaSDK(llvm::StringRef path) { CudaSDKPath = path; };
5959

60-
llvm::Expected<std::unique_ptr<CompilerInstance>> CreateCudaHost();
61-
llvm::Expected<std::unique_ptr<CompilerInstance>> CreateCudaDevice();
60+
llvm::Expected<std::unique_ptr<CompilerInstance>>
61+
CreateCudaHost(llvm::Triple TT);
62+
llvm::Expected<std::unique_ptr<CompilerInstance>>
63+
CreateCudaDevice(llvm::Triple TT);
6264

6365
private:
6466
static llvm::Expected<std::unique_ptr<CompilerInstance>>
65-
create(std::vector<const char *> &ClangArgv);
67+
create(llvm::Triple TT, std::vector<const char *> &ClangArgv);
6668

67-
llvm::Expected<std::unique_ptr<CompilerInstance>> createCuda(bool device);
69+
llvm::Expected<std::unique_ptr<CompilerInstance>> createCuda(llvm::Triple TT,
70+
bool device);
6871

6972
std::vector<const char *> UserArgs;
7073

clang/lib/Interpreter/Interpreter.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ CreateCI(const llvm::opt::ArgStringList &Argv) {
132132
} // anonymous namespace
133133

134134
llvm::Expected<std::unique_ptr<CompilerInstance>>
135-
IncrementalCompilerBuilder::create(std::vector<const char *> &ClangArgv) {
135+
IncrementalCompilerBuilder::create(llvm::Triple TT,
136+
std::vector<const char *> &ClangArgv) {
136137

137138
// If we don't know ClangArgv0 or the address of main() at this point, try
138139
// to guess it anyway (it's possible on some platforms).
@@ -162,8 +163,7 @@ IncrementalCompilerBuilder::create(std::vector<const char *> &ClangArgv) {
162163
TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer;
163164
DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer);
164165

165-
driver::Driver Driver(/*MainBinaryName=*/ClangArgv[0],
166-
llvm::sys::getProcessTriple(), Diags);
166+
driver::Driver Driver(/*MainBinaryName=*/ClangArgv[0], TT.str(), Diags);
167167
Driver.setCheckInputsExist(false); // the input comes from mem buffers
168168
llvm::ArrayRef<const char *> RF = llvm::ArrayRef(ClangArgv);
169169
std::unique_ptr<driver::Compilation> Compilation(Driver.BuildCompilation(RF));
@@ -179,17 +179,17 @@ IncrementalCompilerBuilder::create(std::vector<const char *> &ClangArgv) {
179179
}
180180

181181
llvm::Expected<std::unique_ptr<CompilerInstance>>
182-
IncrementalCompilerBuilder::CreateCpp() {
182+
IncrementalCompilerBuilder::CreateCpp(llvm::Triple TT) {
183183
std::vector<const char *> Argv;
184184
Argv.reserve(5 + 1 + UserArgs.size());
185185
Argv.push_back("-xc++");
186186
Argv.insert(Argv.end(), UserArgs.begin(), UserArgs.end());
187187

188-
return IncrementalCompilerBuilder::create(Argv);
188+
return IncrementalCompilerBuilder::create(TT, Argv);
189189
}
190190

191191
llvm::Expected<std::unique_ptr<CompilerInstance>>
192-
IncrementalCompilerBuilder::createCuda(bool device) {
192+
IncrementalCompilerBuilder::createCuda(llvm::Triple TT, bool device) {
193193
std::vector<const char *> Argv;
194194
Argv.reserve(5 + 4 + UserArgs.size());
195195

@@ -213,17 +213,17 @@ IncrementalCompilerBuilder::createCuda(bool device) {
213213

214214
Argv.insert(Argv.end(), UserArgs.begin(), UserArgs.end());
215215

216-
return IncrementalCompilerBuilder::create(Argv);
216+
return IncrementalCompilerBuilder::create(TT, Argv);
217217
}
218218

219219
llvm::Expected<std::unique_ptr<CompilerInstance>>
220-
IncrementalCompilerBuilder::CreateCudaDevice() {
221-
return IncrementalCompilerBuilder::createCuda(true);
220+
IncrementalCompilerBuilder::CreateCudaDevice(llvm::Triple TT) {
221+
return IncrementalCompilerBuilder::createCuda(TT, true);
222222
}
223223

224224
llvm::Expected<std::unique_ptr<CompilerInstance>>
225-
IncrementalCompilerBuilder::CreateCudaHost() {
226-
return IncrementalCompilerBuilder::createCuda(false);
225+
IncrementalCompilerBuilder::CreateCudaHost(llvm::Triple TT) {
226+
return IncrementalCompilerBuilder::createCuda(TT, false);
227227
}
228228

229229
Interpreter::Interpreter(std::unique_ptr<CompilerInstance> CI,

clang/tools/clang-repl/ClangRepl.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "llvm/Support/ManagedStatic.h" // llvm_shutdown
2525
#include "llvm/Support/Signals.h"
2626
#include "llvm/Support/TargetSelect.h"
27+
#include "llvm/TargetParser/Host.h"
2728
#include <optional>
2829

2930
// Disable LSan for this test.
@@ -109,7 +110,8 @@ ReplListCompleter::operator()(llvm::StringRef Buffer, size_t Pos,
109110
std::vector<llvm::LineEditor::Completion> Comps;
110111
std::vector<std::string> Results;
111112

112-
auto CI = CB.CreateCpp();
113+
llvm::Triple TT(MainInterp.getCompilerInstance()->getTargetOpts().Triple);
114+
auto CI = CB.CreateCpp(TT);
113115
if (auto Err = CI.takeError()) {
114116
ErrRes = std::move(Err);
115117
return {};
@@ -167,6 +169,8 @@ int main(int argc, const char **argv) {
167169
clang::IncrementalCompilerBuilder CB;
168170
CB.SetCompilerArgs(ClangArgv);
169171

172+
llvm::Triple TT(llvm::sys::getProcessTriple());
173+
170174
std::unique_ptr<clang::CompilerInstance> DeviceCI;
171175
if (CudaEnabled) {
172176
if (!CudaPath.empty())
@@ -177,16 +181,16 @@ int main(int argc, const char **argv) {
177181
}
178182
CB.SetOffloadArch(OffloadArch);
179183

180-
DeviceCI = ExitOnErr(CB.CreateCudaDevice());
184+
DeviceCI = ExitOnErr(CB.CreateCudaDevice(TT));
181185
}
182186

183187
// FIXME: Investigate if we could use runToolOnCodeWithArgs from tooling. It
184188
// can replace the boilerplate code for creation of the compiler instance.
185189
std::unique_ptr<clang::CompilerInstance> CI;
186190
if (CudaEnabled) {
187-
CI = ExitOnErr(CB.CreateCudaHost());
191+
CI = ExitOnErr(CB.CreateCudaHost(TT));
188192
} else {
189-
CI = ExitOnErr(CB.CreateCpp());
193+
CI = ExitOnErr(CB.CreateCpp(TT));
190194
}
191195

192196
// Set an error handler, so that any LLVM backend diagnostics go through our

0 commit comments

Comments
 (0)