Skip to content

Commit 13e2505

Browse files
committed
[IR] Store Triple in Module (NFC)
The module currently stores the target triple as a string. This means that any code that wants to actually use the triple first has to instantiate a Triple, which is somewhat expensive. The change in #121652 caused a moderate compile-time regression due to this. While it would be easy enough to work around, I think that architecturally, it makes more sense to store the parsed Triple in the module, so that it can always be directly queried. For this change, I've opted not to add any magic conversions between std::string and Triple for backwards-compatibilty purses, and instead write out needed Triple()s or str()s explicitly. This is because I think a decent number of them should be changed to work on Triple as well, to avoid unnecessary conversions back and forth. The only interesting part in this patch is that the default triple is Triple("") instead of Triple() to preserve existing behavior. The former defaults to using the ELF object format instead of unknown object format. We should fix that as well.
1 parent 5c375c3 commit 13e2505

File tree

93 files changed

+195
-201
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+195
-201
lines changed

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ static void setCommandLineOpts(const CodeGenOptions &CodeGenOpts) {
595595
void EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
596596
// Create the TargetMachine for generating code.
597597
std::string Error;
598-
std::string Triple = TheModule->getTargetTriple();
598+
std::string Triple = TheModule->getTargetTriple().str();
599599
const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
600600
if (!TheTarget) {
601601
if (MustCreateTM)

clang/lib/CodeGen/CodeGenAction.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,7 @@ CodeGenAction::loadModule(MemoryBufferRef MBRef) {
10321032
// linker using merged object file.
10331033
if (!Bm) {
10341034
auto M = std::make_unique<llvm::Module>("empty", *VMContext);
1035-
M->setTargetTriple(CI.getTargetOpts().Triple);
1035+
M->setTargetTriple(Triple(CI.getTargetOpts().Triple));
10361036
return M;
10371037
}
10381038
Expected<std::unique_ptr<llvm::Module>> MOrErr =
@@ -1123,10 +1123,10 @@ void CodeGenAction::ExecuteAction() {
11231123
return;
11241124

11251125
const TargetOptions &TargetOpts = CI.getTargetOpts();
1126-
if (TheModule->getTargetTriple() != TargetOpts.Triple) {
1126+
if (TheModule->getTargetTriple().str() != TargetOpts.Triple) {
11271127
Diagnostics.Report(SourceLocation(), diag::warn_fe_override_module)
11281128
<< TargetOpts.Triple;
1129-
TheModule->setTargetTriple(TargetOpts.Triple);
1129+
TheModule->setTargetTriple(Triple(TargetOpts.Triple));
11301130
}
11311131

11321132
EmbedObject(TheModule.get(), CodeGenOpts, Diagnostics);

clang/lib/CodeGen/ModuleBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ namespace {
151151
void Initialize(ASTContext &Context) override {
152152
Ctx = &Context;
153153

154-
M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple());
154+
M->setTargetTriple(Ctx->getTargetInfo().getTriple());
155155
M->setDataLayout(Ctx->getTargetInfo().getDataLayoutString());
156156
const auto &SDKVersion = Ctx->getTargetInfo().getSDKVersion();
157157
if (!SDKVersion.empty())

clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ class PCHContainerGenerator : public ASTConsumer {
255255
if (Diags.hasErrorOccurred())
256256
return;
257257

258-
M->setTargetTriple(Ctx.getTargetInfo().getTriple().getTriple());
258+
M->setTargetTriple(Ctx.getTargetInfo().getTriple());
259259
M->setDataLayout(Ctx.getTargetInfo().getDataLayoutString());
260260

261261
// PCH files don't have a signature field in the control block,

clang/lib/Interpreter/DeviceOffload.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@ llvm::Expected<llvm::StringRef> IncrementalCUDADeviceParser::GeneratePTX() {
7777
std::string Error;
7878

7979
const llvm::Target *Target = llvm::TargetRegistry::lookupTarget(
80-
PTU.TheModule->getTargetTriple(), Error);
80+
PTU.TheModule->getTargetTriple().str(), Error);
8181
if (!Target)
8282
return llvm::make_error<llvm::StringError>(std::move(Error),
8383
std::error_code());
8484
llvm::TargetOptions TO = llvm::TargetOptions();
8585
llvm::TargetMachine *TargetMachine = Target->createTargetMachine(
86-
PTU.TheModule->getTargetTriple(), TargetOpts.CPU, "", TO,
86+
PTU.TheModule->getTargetTriple().str(), TargetOpts.CPU, "", TO,
8787
llvm::Reloc::Model::PIC_);
8888
PTU.TheModule->setDataLayout(TargetMachine->createDataLayout());
8989

clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ static std::string OptLLVM(const std::string &IR, CodeGenOptLevel OLvl) {
127127
ErrorAndExit(E);
128128

129129
std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine(
130-
M->getTargetTriple(), codegen::getCPUStr(), codegen::getFeaturesStr(),
131-
Options, codegen::getExplicitRelocModel(),
130+
M->getTargetTriple().str(), codegen::getCPUStr(),
131+
codegen::getFeaturesStr(), Options, codegen::getExplicitRelocModel(),
132132
codegen::getExplicitCodeModel(), OLvl));
133133
if (!TM)
134134
ErrorAndExit("Could not create target machine");

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -622,16 +622,17 @@ Expected<StringRef> writeOffloadFile(const OffloadFile &File) {
622622
Expected<StringRef> compileModule(Module &M, OffloadKind Kind) {
623623
llvm::TimeTraceScope TimeScope("Compile module");
624624
std::string Msg;
625-
const Target *T = TargetRegistry::lookupTarget(M.getTargetTriple(), Msg);
625+
const Target *T =
626+
TargetRegistry::lookupTarget(M.getTargetTriple().str(), Msg);
626627
if (!T)
627628
return createStringError(Msg);
628629

629630
auto Options =
630-
codegen::InitTargetOptionsFromCodeGenFlags(Triple(M.getTargetTriple()));
631+
codegen::InitTargetOptionsFromCodeGenFlags(M.getTargetTriple());
631632
StringRef CPU = "";
632633
StringRef Features = "";
633634
std::unique_ptr<TargetMachine> TM(
634-
T->createTargetMachine(M.getTargetTriple(), CPU, Features, Options,
635+
T->createTargetMachine(M.getTargetTriple().str(), CPU, Features, Options,
635636
Reloc::PIC_, M.getCodeModel()));
636637

637638
if (M.getDataLayout().isDefault())
@@ -650,7 +651,7 @@ Expected<StringRef> compileModule(Module &M, OffloadKind Kind) {
650651
auto OS = std::make_unique<llvm::raw_fd_ostream>(FD, true);
651652

652653
legacy::PassManager CodeGenPasses;
653-
TargetLibraryInfoImpl TLII(Triple(M.getTargetTriple()));
654+
TargetLibraryInfoImpl TLII(M.getTargetTriple());
654655
CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
655656
if (TM->addPassesToEmitFile(CodeGenPasses, *OS, nullptr,
656657
CodeGenFileType::ObjectFile))
@@ -674,8 +675,8 @@ wrapDeviceImages(ArrayRef<std::unique_ptr<MemoryBuffer>> Buffers,
674675

675676
LLVMContext Context;
676677
Module M("offload.wrapper.module", Context);
677-
M.setTargetTriple(
678-
Args.getLastArgValue(OPT_host_triple_EQ, sys::getDefaultTargetTriple()));
678+
M.setTargetTriple(Triple(
679+
Args.getLastArgValue(OPT_host_triple_EQ, sys::getDefaultTargetTriple())));
679680

680681
switch (Kind) {
681682
case OFK_OpenMP:

llvm/examples/OrcV2Examples/LLJITWithThinLTOSummaries/LLJITWithThinLTOSummaries.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ int main(int Argc, char *Argv[]) {
207207
ExitOnErr(JITTargetMachineBuilder::detectHost()));
208208
} else {
209209
Builder.setJITTargetMachineBuilder(
210-
JITTargetMachineBuilder(Triple(M.getTargetTriple())));
210+
JITTargetMachineBuilder(M.getTargetTriple()));
211211
}
212212
if (!M.getDataLayout().getStringRepresentation().empty())
213213
Builder.setDataLayout(M.getDataLayout());

llvm/include/llvm/ExecutionEngine/Orc/ExecutionUtils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class StaticInitGVIterator {
104104

105105
StaticInitGVIterator(Module &M)
106106
: I(M.global_values().begin()), E(M.global_values().end()),
107-
ObjFmt(Triple(M.getTargetTriple()).getObjectFormat()) {
107+
ObjFmt(M.getTargetTriple().getObjectFormat()) {
108108
if (I != E) {
109109
if (!isStaticInitGlobal(*I))
110110
moveToNextStaticInitGlobal();

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ class OpenMPIRBuilder {
479479
/// not have an effect on \p M (see initialize)
480480
OpenMPIRBuilder(Module &M)
481481
: M(M), Builder(M.getContext()), OffloadInfoManager(this),
482-
T(Triple(M.getTargetTriple())) {}
482+
T(M.getTargetTriple()) {}
483483
~OpenMPIRBuilder();
484484

485485
class AtomicInfo : public llvm::AtomicInfo {

0 commit comments

Comments
 (0)