[llvm] [llvm] Fix string and Twine concatenation for C++26 P2591R5 (PR #227959)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 4 13:07:44 PDT 2026
https://github.com/rdong8 updated https://github.com/llvm/llvm-project/pull/227959
>From f70e9a5c4dea74969fc7cb999db6fca5a59ed59e Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Thu, 1 Oct 2026 05:21:13 +0000
Subject: [PATCH 1/7] [llvm] Fix string and Twine concatenation for C++26
P2591R5
P2591R5 ("Concatenation of strings and string views") adds operator+
overloads between std::string and std::string_view.
In LLVM, expressions concatenating a std::string and a StringRef
(or string literal / StringRef) chained with .str() (such as
`(Prefix + Name).str()`) previously relied on implicit conversions to
llvm::Twine to invoke llvm::operator+(const Twine&, const Twine&).
Under C++26 with P2591R5, StringRef's conversion to std::string_view
causes these expressions to either become ambiguous or resolve to
std::operator+(const std::string&, std::string_view), which returns
std::string (which does not have a .str() member).
Fix these by explicitly wrapping operands with Twine(...) or using
StringRef instead of std::string where appropriate.
---
llvm/include/llvm/Analysis/ReleaseModeModelRunner.h | 3 ++-
llvm/lib/Analysis/CFGPrinter.cpp | 2 +-
llvm/lib/Analysis/ReplayInlineAdvisor.cpp | 3 ++-
llvm/lib/CodeGen/MachineCFGPrinter.cpp | 3 ++-
llvm/lib/FileCheck/FileCheck.cpp | 7 ++++---
llvm/lib/Frontend/OpenMP/OMP.cpp | 3 ++-
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 2 +-
llvm/lib/IR/AutoUpgrade.cpp | 2 +-
llvm/lib/Support/CodeGenCoverage.cpp | 5 ++---
llvm/lib/Support/VirtualFileSystem.cpp | 4 ++--
llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp | 4 +++-
llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp | 3 ++-
llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 5 +++--
llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 3 ++-
.../Transforms/Instrumentation/SanitizerBinaryMetadata.cpp | 3 ++-
15 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index ff423a9155b14..3ca3205406946 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,6 +15,7 @@
#define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/MLModelRunner.h"
#include "llvm/Analysis/TensorSpec.h"
#include "llvm/Support/ErrorHandling.h"
@@ -119,7 +120,7 @@ class ReleaseModeModelRunner final : public MLModelRunner {
void populateTensor(size_t Pos, const TensorSpec &Spec, StringRef Prefix,
bool &InputIsPresent) {
const int Index =
- CompiledModel->LookupArgIndex((Prefix + Spec.name()).str());
+ CompiledModel->LookupArgIndex((Twine(Prefix) + Spec.name()).str());
void *Buffer = nullptr;
InputIsPresent = Index >= 0;
if (InputIsPresent)
diff --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp
index 39108a906f081..25f3f95e47485 100644
--- a/llvm/lib/Analysis/CFGPrinter.cpp
+++ b/llvm/lib/Analysis/CFGPrinter.cpp
@@ -62,7 +62,7 @@ static void writeCFGToDotFile(Function &F, BlockFrequencyInfo *BFI,
BranchProbabilityInfo *BPI, uint64_t MaxFreq,
bool CFGOnly = false) {
std::string Filename =
- (CFGDotFilenamePrefix + "." + F.getName() + ".dot").str();
+ (Twine(CFGDotFilenamePrefix) + "." + F.getName() + ".dot").str();
errs() << "Writing '" << Filename << "'...";
std::error_code EC;
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 7253478a0eedf..1b4f159105342 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,6 +14,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/ReplayInlineAdvisor.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LineIterator.h"
@@ -107,7 +108,7 @@ std::unique_ptr<InlineAdvice> ReplayInlineAdvisor::getAdviceImpl(CallBase &CB) {
std::string CallSiteLoc =
formatCallSiteLocation(CB.getDebugLoc(), ReplaySettings.ReplayFormat);
StringRef Callee = CB.getCalledFunction()->getName();
- std::string Combined = (Callee + CallSiteLoc).str();
+ std::string Combined = (Twine(Callee) + CallSiteLoc).str();
// Replay decision, if it has one
auto Iter = InlineSitesFromRemarks.find(Combined);
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index c604d4fd6e1e6..dec83d49b99cb 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -17,6 +17,7 @@
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Support/GraphWriter.h"
using namespace llvm;
@@ -38,7 +39,7 @@ static cl::opt<bool>
static void writeMCFGToDotFile(MachineFunction &MF) {
std::string Filename =
- (MCFGDotFilenamePrefix + "." + MF.getName() + ".dot").str();
+ (Twine(MCFGDotFilenamePrefix) + "." + MF.getName() + ".dot").str();
errs() << "Writing '" << Filename << "'...";
std::error_code EC;
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index b8dd76d91dee2..df220a9699f90 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -1843,8 +1843,8 @@ bool FileCheck::readCheckFile(
for (StringRef PatternString : Req.ImplicitCheckNot) {
// Create a buffer with fake command line content in order to display the
// command line option responsible for the specific implicit CHECK-NOT.
- std::string Prefix = "-implicit-check-not='";
- std::string Suffix = "'";
+ StringRef Prefix = "-implicit-check-not='";
+ StringRef Suffix = "'";
std::unique_ptr<MemoryBuffer> CmdLine = MemoryBuffer::getMemBufferCopy(
(Prefix + PatternString + Suffix).str(), "command line");
@@ -2592,7 +2592,8 @@ Error FileCheckPatternContext::defineCmdlineVariables(
// Append a copy of the command-line definition adapted to use the same
// format as in the input file to be able to reuse
// parseNumericSubstitutionBlock.
- CmdlineDefsDiag += (DefPrefix + CmdlineDef + " (parsed as: [[").str();
+ CmdlineDefsDiag +=
+ (Twine(DefPrefix) + CmdlineDef + " (parsed as: [[").str();
std::string SubstitutionStr = std::string(CmdlineDef);
SubstitutionStr[EqIdx] = ':';
CmdlineDefsIndices.push_back(
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index 8bfe3a6a7cc4a..ff584568d3cd9 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,6 +12,7 @@
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
#include "llvm/Support/ErrorHandling.h"
@@ -241,7 +242,7 @@ std::string prettifyFunctionName(StringRef FunctionName) {
auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
if (LineNo == 0)
return FunctionName.str();
- return ("omp target in " + ParentName + " @ " + std::to_string(LineNo) +
+ return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
" (" + FunctionName + ")")
.str();
}
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 3a8125b835e53..89dc139f80407 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4656,7 +4656,7 @@ Expected<Function *> OpenMPIRBuilder::emitGlobalToListReduceFunction(
std::string OpenMPIRBuilder::getReductionFuncName(StringRef Name) const {
std::string Suffix =
createPlatformSpecificName({"omp", "reduction", "reduction_func"});
- return (Name + Suffix).str();
+ return (Twine(Name) + Suffix).str();
}
Expected<Function *> OpenMPIRBuilder::createReductionFunction(
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 43651371e730d..dedbc55d51c00 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7935,7 +7935,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
// to fix more IR than it breaks.
// Intel MCU is an exception and uses 4-byte-alignment.
if (!T.isOSIAMCU()) {
- std::string I128 = "-i128:128";
+ StringRef I128 = "-i128:128";
if (StringRef Ref = Res; !Ref.contains(I128)) {
SmallVector<StringRef, 4> Groups;
Regex R("^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
diff --git a/llvm/lib/Support/CodeGenCoverage.cpp b/llvm/lib/Support/CodeGenCoverage.cpp
index 2e35019e12c16..e1b04bbc64e16 100644
--- a/llvm/lib/Support/CodeGenCoverage.cpp
+++ b/llvm/lib/Support/CodeGenCoverage.cpp
@@ -83,9 +83,8 @@ bool CodeGenCoverage::emit(StringRef CoveragePrefix,
// We can handle locking within a process easily enough but we don't want to
// manage it between multiple processes. Use the process ID to ensure no
// more than one process is ever writing to the same file at the same time.
- std::string Pid = llvm::to_string(sys::Process::getProcessId());
-
- std::string CoverageFilename = (CoveragePrefix + Pid).str();
+ std::string CoverageFilename =
+ (CoveragePrefix + Twine(sys::Process::getProcessId())).str();
std::error_code EC;
sys::fs::OpenFlags OpenFlags = sys::fs::OF_Append;
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp
index 5d0a3949e60ca..27004c0c0af13 100644
--- a/llvm/lib/Support/VirtualFileSystem.cpp
+++ b/llvm/lib/Support/VirtualFileSystem.cpp
@@ -707,7 +707,7 @@ class InMemoryFile : public InMemoryNode {
llvm::MemoryBuffer *getBuffer() const { return Buffer.get(); }
std::string toString(unsigned Indent) const override {
- return (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+ return (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
}
static bool classof(const InMemoryNode *N) {
@@ -829,7 +829,7 @@ class InMemoryDirectory : public InMemoryNode {
std::string toString(unsigned Indent) const override {
std::string Result =
- (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+ (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
for (const auto &Entry : Entries)
Result += Entry.second->toString(Indent + 2);
return Result;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index 467fdbfd0e05b..e30c2a262eede 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,6 +16,7 @@
#include "ARMInstPrinter.h"
#include "ARMMCAsmInfo.h"
#include "TargetInfo/ARMTargetInfo.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCCodeEmitter.h"
@@ -144,7 +145,8 @@ std::string ARM_MC::ParseARMTriple(const Triple &TT, StringRef CPU) {
ARM::ArchKind ArchID = ARM::parseArch(TT.getArchName());
if (ArchID != ARM::ArchKind::INVALID && (CPU.empty() || CPU == "generic"))
- ARMArchFeature = (ARMArchFeature + "+" + ARM::getArchName(ArchID)).str();
+ ARMArchFeature =
+ (Twine(ARMArchFeature) + "+" + ARM::getArchName(ArchID)).str();
if (TT.isThumb()) {
if (!ARMArchFeature.empty())
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 9d2904dec0ad0..0599796dc79dc 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,6 +16,7 @@
#include "M68kMCAsmInfo.h"
#include "TargetInfo/M68kTargetInfo.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCELFStreamer.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCInstrInfo.h"
@@ -62,7 +63,7 @@ static MCSubtargetInfo *createM68kMCSubtargetInfo(const Triple &TT,
std::string ArchFS = ParseM68kTriple(TT, CPU);
if (!FS.empty()) {
if (!ArchFS.empty()) {
- ArchFS = (ArchFS + "," + FS).str();
+ ArchFS = (Twine(ArchFS) + "," + FS).str();
} else {
ArchFS = FS.str();
}
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 84196697060e3..3a9301b664dab 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,6 +17,7 @@
#include "SPIRVUtils.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringTable.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/IntrinsicsSPIRV.h"
#include <regex>
@@ -339,12 +340,12 @@ lookupBuiltin(StringRef DemangledCall,
// If argument-type name prefix was added, look up the builtin again.
if (!Prefix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((Prefix + BuiltinName).str(), Set)))
+ (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
if (!Suffix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((BuiltinName + Suffix).str(), Set)))
+ (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 84bab9487f0c8..44b756109e9b2 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,6 +29,7 @@
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/BinaryFormat/Wasm.h"
#include "llvm/CodeGen/Analysis.h"
@@ -589,7 +590,7 @@ void WebAssemblyAsmPrinter::EmitTargetFeatures(Module &M) {
// Read target features and linkage policies from module metadata
SmallVector<FeatureEntry, 4> EmittedFeatures;
auto EmitFeature = [&](std::string Feature) {
- std::string MDKey = (StringRef("wasm-feature-") + Feature).str();
+ std::string MDKey = (Twine("wasm-feature-") + Feature).str();
Metadata *Policy = M.getModuleFlag(MDKey);
if (Policy == nullptr)
return;
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
index 210b1266de23c..c45c804ad6cca 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
@@ -213,7 +213,8 @@ bool SanitizerBinaryMetadata::run() {
// Calls to the initialization functions with different versions cannot be
// merged. Give the structors unique names based on the version, which will
// also be used as the COMDAT key.
- const std::string StructorPrefix = (MI->FunctionPrefix + VersionStr).str();
+ const std::string StructorPrefix =
+ (Twine(MI->FunctionPrefix) + VersionStr).str();
// We declare the _add and _del functions as weak, and only call them if
// there is a valid symbol linked. This allows building binaries with
>From 192be4e2233087a66389a596806a60d56e0383d1 Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Thu, 1 Oct 2026 16:33:15 +0000
Subject: [PATCH 2/7] Revert "[llvm] Fix string and Twine concatenation for
C++26 P2591R5"
This reverts commit f70e9a5c4dea74969fc7cb999db6fca5a59ed59e.
---
llvm/include/llvm/Analysis/ReleaseModeModelRunner.h | 3 +--
llvm/lib/Analysis/CFGPrinter.cpp | 2 +-
llvm/lib/Analysis/ReplayInlineAdvisor.cpp | 3 +--
llvm/lib/CodeGen/MachineCFGPrinter.cpp | 3 +--
llvm/lib/FileCheck/FileCheck.cpp | 7 +++----
llvm/lib/Frontend/OpenMP/OMP.cpp | 3 +--
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 2 +-
llvm/lib/IR/AutoUpgrade.cpp | 2 +-
llvm/lib/Support/CodeGenCoverage.cpp | 5 +++--
llvm/lib/Support/VirtualFileSystem.cpp | 4 ++--
llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp | 4 +---
llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp | 3 +--
llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 5 ++---
llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 3 +--
.../Transforms/Instrumentation/SanitizerBinaryMetadata.cpp | 3 +--
15 files changed, 21 insertions(+), 31 deletions(-)
diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index 3ca3205406946..ff423a9155b14 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,7 +15,6 @@
#define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/MLModelRunner.h"
#include "llvm/Analysis/TensorSpec.h"
#include "llvm/Support/ErrorHandling.h"
@@ -120,7 +119,7 @@ class ReleaseModeModelRunner final : public MLModelRunner {
void populateTensor(size_t Pos, const TensorSpec &Spec, StringRef Prefix,
bool &InputIsPresent) {
const int Index =
- CompiledModel->LookupArgIndex((Twine(Prefix) + Spec.name()).str());
+ CompiledModel->LookupArgIndex((Prefix + Spec.name()).str());
void *Buffer = nullptr;
InputIsPresent = Index >= 0;
if (InputIsPresent)
diff --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp
index 25f3f95e47485..39108a906f081 100644
--- a/llvm/lib/Analysis/CFGPrinter.cpp
+++ b/llvm/lib/Analysis/CFGPrinter.cpp
@@ -62,7 +62,7 @@ static void writeCFGToDotFile(Function &F, BlockFrequencyInfo *BFI,
BranchProbabilityInfo *BPI, uint64_t MaxFreq,
bool CFGOnly = false) {
std::string Filename =
- (Twine(CFGDotFilenamePrefix) + "." + F.getName() + ".dot").str();
+ (CFGDotFilenamePrefix + "." + F.getName() + ".dot").str();
errs() << "Writing '" << Filename << "'...";
std::error_code EC;
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 1b4f159105342..7253478a0eedf 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,7 +14,6 @@
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/ReplayInlineAdvisor.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LineIterator.h"
@@ -108,7 +107,7 @@ std::unique_ptr<InlineAdvice> ReplayInlineAdvisor::getAdviceImpl(CallBase &CB) {
std::string CallSiteLoc =
formatCallSiteLocation(CB.getDebugLoc(), ReplaySettings.ReplayFormat);
StringRef Callee = CB.getCalledFunction()->getName();
- std::string Combined = (Twine(Callee) + CallSiteLoc).str();
+ std::string Combined = (Callee + CallSiteLoc).str();
// Replay decision, if it has one
auto Iter = InlineSitesFromRemarks.find(Combined);
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index dec83d49b99cb..c604d4fd6e1e6 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -17,7 +17,6 @@
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Support/GraphWriter.h"
using namespace llvm;
@@ -39,7 +38,7 @@ static cl::opt<bool>
static void writeMCFGToDotFile(MachineFunction &MF) {
std::string Filename =
- (Twine(MCFGDotFilenamePrefix) + "." + MF.getName() + ".dot").str();
+ (MCFGDotFilenamePrefix + "." + MF.getName() + ".dot").str();
errs() << "Writing '" << Filename << "'...";
std::error_code EC;
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index df220a9699f90..b8dd76d91dee2 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -1843,8 +1843,8 @@ bool FileCheck::readCheckFile(
for (StringRef PatternString : Req.ImplicitCheckNot) {
// Create a buffer with fake command line content in order to display the
// command line option responsible for the specific implicit CHECK-NOT.
- StringRef Prefix = "-implicit-check-not='";
- StringRef Suffix = "'";
+ std::string Prefix = "-implicit-check-not='";
+ std::string Suffix = "'";
std::unique_ptr<MemoryBuffer> CmdLine = MemoryBuffer::getMemBufferCopy(
(Prefix + PatternString + Suffix).str(), "command line");
@@ -2592,8 +2592,7 @@ Error FileCheckPatternContext::defineCmdlineVariables(
// Append a copy of the command-line definition adapted to use the same
// format as in the input file to be able to reuse
// parseNumericSubstitutionBlock.
- CmdlineDefsDiag +=
- (Twine(DefPrefix) + CmdlineDef + " (parsed as: [[").str();
+ CmdlineDefsDiag += (DefPrefix + CmdlineDef + " (parsed as: [[").str();
std::string SubstitutionStr = std::string(CmdlineDef);
SubstitutionStr[EqIdx] = ':';
CmdlineDefsIndices.push_back(
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index ff584568d3cd9..8bfe3a6a7cc4a 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,7 +12,6 @@
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
#include "llvm/Support/ErrorHandling.h"
@@ -242,7 +241,7 @@ std::string prettifyFunctionName(StringRef FunctionName) {
auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
if (LineNo == 0)
return FunctionName.str();
- return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
+ return ("omp target in " + ParentName + " @ " + std::to_string(LineNo) +
" (" + FunctionName + ")")
.str();
}
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 89dc139f80407..3a8125b835e53 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4656,7 +4656,7 @@ Expected<Function *> OpenMPIRBuilder::emitGlobalToListReduceFunction(
std::string OpenMPIRBuilder::getReductionFuncName(StringRef Name) const {
std::string Suffix =
createPlatformSpecificName({"omp", "reduction", "reduction_func"});
- return (Twine(Name) + Suffix).str();
+ return (Name + Suffix).str();
}
Expected<Function *> OpenMPIRBuilder::createReductionFunction(
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index dedbc55d51c00..43651371e730d 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7935,7 +7935,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
// to fix more IR than it breaks.
// Intel MCU is an exception and uses 4-byte-alignment.
if (!T.isOSIAMCU()) {
- StringRef I128 = "-i128:128";
+ std::string I128 = "-i128:128";
if (StringRef Ref = Res; !Ref.contains(I128)) {
SmallVector<StringRef, 4> Groups;
Regex R("^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
diff --git a/llvm/lib/Support/CodeGenCoverage.cpp b/llvm/lib/Support/CodeGenCoverage.cpp
index e1b04bbc64e16..2e35019e12c16 100644
--- a/llvm/lib/Support/CodeGenCoverage.cpp
+++ b/llvm/lib/Support/CodeGenCoverage.cpp
@@ -83,8 +83,9 @@ bool CodeGenCoverage::emit(StringRef CoveragePrefix,
// We can handle locking within a process easily enough but we don't want to
// manage it between multiple processes. Use the process ID to ensure no
// more than one process is ever writing to the same file at the same time.
- std::string CoverageFilename =
- (CoveragePrefix + Twine(sys::Process::getProcessId())).str();
+ std::string Pid = llvm::to_string(sys::Process::getProcessId());
+
+ std::string CoverageFilename = (CoveragePrefix + Pid).str();
std::error_code EC;
sys::fs::OpenFlags OpenFlags = sys::fs::OF_Append;
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp
index 27004c0c0af13..5d0a3949e60ca 100644
--- a/llvm/lib/Support/VirtualFileSystem.cpp
+++ b/llvm/lib/Support/VirtualFileSystem.cpp
@@ -707,7 +707,7 @@ class InMemoryFile : public InMemoryNode {
llvm::MemoryBuffer *getBuffer() const { return Buffer.get(); }
std::string toString(unsigned Indent) const override {
- return (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
+ return (std::string(Indent, ' ') + Stat.getName() + "\n").str();
}
static bool classof(const InMemoryNode *N) {
@@ -829,7 +829,7 @@ class InMemoryDirectory : public InMemoryNode {
std::string toString(unsigned Indent) const override {
std::string Result =
- (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
+ (std::string(Indent, ' ') + Stat.getName() + "\n").str();
for (const auto &Entry : Entries)
Result += Entry.second->toString(Indent + 2);
return Result;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index e30c2a262eede..467fdbfd0e05b 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,7 +16,6 @@
#include "ARMInstPrinter.h"
#include "ARMMCAsmInfo.h"
#include "TargetInfo/ARMTargetInfo.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCCodeEmitter.h"
@@ -145,8 +144,7 @@ std::string ARM_MC::ParseARMTriple(const Triple &TT, StringRef CPU) {
ARM::ArchKind ArchID = ARM::parseArch(TT.getArchName());
if (ArchID != ARM::ArchKind::INVALID && (CPU.empty() || CPU == "generic"))
- ARMArchFeature =
- (Twine(ARMArchFeature) + "+" + ARM::getArchName(ArchID)).str();
+ ARMArchFeature = (ARMArchFeature + "+" + ARM::getArchName(ArchID)).str();
if (TT.isThumb()) {
if (!ARMArchFeature.empty())
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 0599796dc79dc..9d2904dec0ad0 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,7 +16,6 @@
#include "M68kMCAsmInfo.h"
#include "TargetInfo/M68kTargetInfo.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCELFStreamer.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCInstrInfo.h"
@@ -63,7 +62,7 @@ static MCSubtargetInfo *createM68kMCSubtargetInfo(const Triple &TT,
std::string ArchFS = ParseM68kTriple(TT, CPU);
if (!FS.empty()) {
if (!ArchFS.empty()) {
- ArchFS = (Twine(ArchFS) + "," + FS).str();
+ ArchFS = (ArchFS + "," + FS).str();
} else {
ArchFS = FS.str();
}
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 3a9301b664dab..84196697060e3 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,7 +17,6 @@
#include "SPIRVUtils.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringTable.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/IntrinsicsSPIRV.h"
#include <regex>
@@ -340,12 +339,12 @@ lookupBuiltin(StringRef DemangledCall,
// If argument-type name prefix was added, look up the builtin again.
if (!Prefix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
+ (Builtin = SPIRV::lookupBuiltin((Prefix + BuiltinName).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
if (!Suffix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
+ (Builtin = SPIRV::lookupBuiltin((BuiltinName + Suffix).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 44b756109e9b2..84bab9487f0c8 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,7 +29,6 @@
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/BinaryFormat/Wasm.h"
#include "llvm/CodeGen/Analysis.h"
@@ -590,7 +589,7 @@ void WebAssemblyAsmPrinter::EmitTargetFeatures(Module &M) {
// Read target features and linkage policies from module metadata
SmallVector<FeatureEntry, 4> EmittedFeatures;
auto EmitFeature = [&](std::string Feature) {
- std::string MDKey = (Twine("wasm-feature-") + Feature).str();
+ std::string MDKey = (StringRef("wasm-feature-") + Feature).str();
Metadata *Policy = M.getModuleFlag(MDKey);
if (Policy == nullptr)
return;
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
index c45c804ad6cca..210b1266de23c 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
@@ -213,8 +213,7 @@ bool SanitizerBinaryMetadata::run() {
// Calls to the initialization functions with different versions cannot be
// merged. Give the structors unique names based on the version, which will
// also be used as the COMDAT key.
- const std::string StructorPrefix =
- (Twine(MI->FunctionPrefix) + VersionStr).str();
+ const std::string StructorPrefix = (MI->FunctionPrefix + VersionStr).str();
// We declare the _add and _del functions as weak, and only call them if
// there is a valid symbol linked. This allows building binaries with
>From 1ed8666703afdbfaa3f78d3b0236bf8af9e907dc Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Thu, 1 Oct 2026 16:38:48 +0000
Subject: [PATCH 3/7] [ADT] Make StringRef to std::string_view conversion
explicit
---
llvm/include/llvm/ADT/StringRef.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h
index 724c27da0ee95..b21a73a2790d4 100644
--- a/llvm/include/llvm/ADT/StringRef.h
+++ b/llvm/include/llvm/ADT/StringRef.h
@@ -246,7 +246,7 @@ class LLVM_GSL_POINTER StringRef {
/// @name Type Conversions
/// @{
- constexpr operator std::string_view() const {
+ explicit constexpr operator std::string_view() const {
return std::string_view(data(), size());
}
>From d484c977ecf4f7d316c1ce3c4962edc1680ca79f Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Fri, 2 Oct 2026 13:20:12 +0000
Subject: [PATCH 4/7] Revert "[ADT] Make StringRef to std::string_view
conversion explicit"
This reverts commit 1ed8666703afdbfaa3f78d3b0236bf8af9e907dc.
---
llvm/include/llvm/ADT/StringRef.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h
index b21a73a2790d4..724c27da0ee95 100644
--- a/llvm/include/llvm/ADT/StringRef.h
+++ b/llvm/include/llvm/ADT/StringRef.h
@@ -246,7 +246,7 @@ class LLVM_GSL_POINTER StringRef {
/// @name Type Conversions
/// @{
- explicit constexpr operator std::string_view() const {
+ constexpr operator std::string_view() const {
return std::string_view(data(), size());
}
>From 20ee4f0f519fa4656049537cc57fbd728cd63113 Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Fri, 2 Oct 2026 13:20:27 +0000
Subject: [PATCH 5/7] Reapply "[llvm] Fix string and Twine concatenation for
C++26 P2591R5"
This reverts commit 192be4e2233087a66389a596806a60d56e0383d1.
---
llvm/include/llvm/Analysis/ReleaseModeModelRunner.h | 3 ++-
llvm/lib/Analysis/CFGPrinter.cpp | 2 +-
llvm/lib/Analysis/ReplayInlineAdvisor.cpp | 3 ++-
llvm/lib/CodeGen/MachineCFGPrinter.cpp | 3 ++-
llvm/lib/FileCheck/FileCheck.cpp | 7 ++++---
llvm/lib/Frontend/OpenMP/OMP.cpp | 3 ++-
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 2 +-
llvm/lib/IR/AutoUpgrade.cpp | 2 +-
llvm/lib/Support/CodeGenCoverage.cpp | 5 ++---
llvm/lib/Support/VirtualFileSystem.cpp | 4 ++--
llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp | 4 +++-
llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp | 3 ++-
llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 5 +++--
llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 3 ++-
.../Transforms/Instrumentation/SanitizerBinaryMetadata.cpp | 3 ++-
15 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index ff423a9155b14..3ca3205406946 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,6 +15,7 @@
#define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/MLModelRunner.h"
#include "llvm/Analysis/TensorSpec.h"
#include "llvm/Support/ErrorHandling.h"
@@ -119,7 +120,7 @@ class ReleaseModeModelRunner final : public MLModelRunner {
void populateTensor(size_t Pos, const TensorSpec &Spec, StringRef Prefix,
bool &InputIsPresent) {
const int Index =
- CompiledModel->LookupArgIndex((Prefix + Spec.name()).str());
+ CompiledModel->LookupArgIndex((Twine(Prefix) + Spec.name()).str());
void *Buffer = nullptr;
InputIsPresent = Index >= 0;
if (InputIsPresent)
diff --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp
index 39108a906f081..25f3f95e47485 100644
--- a/llvm/lib/Analysis/CFGPrinter.cpp
+++ b/llvm/lib/Analysis/CFGPrinter.cpp
@@ -62,7 +62,7 @@ static void writeCFGToDotFile(Function &F, BlockFrequencyInfo *BFI,
BranchProbabilityInfo *BPI, uint64_t MaxFreq,
bool CFGOnly = false) {
std::string Filename =
- (CFGDotFilenamePrefix + "." + F.getName() + ".dot").str();
+ (Twine(CFGDotFilenamePrefix) + "." + F.getName() + ".dot").str();
errs() << "Writing '" << Filename << "'...";
std::error_code EC;
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 7253478a0eedf..1b4f159105342 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,6 +14,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/ReplayInlineAdvisor.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LineIterator.h"
@@ -107,7 +108,7 @@ std::unique_ptr<InlineAdvice> ReplayInlineAdvisor::getAdviceImpl(CallBase &CB) {
std::string CallSiteLoc =
formatCallSiteLocation(CB.getDebugLoc(), ReplaySettings.ReplayFormat);
StringRef Callee = CB.getCalledFunction()->getName();
- std::string Combined = (Callee + CallSiteLoc).str();
+ std::string Combined = (Twine(Callee) + CallSiteLoc).str();
// Replay decision, if it has one
auto Iter = InlineSitesFromRemarks.find(Combined);
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index c604d4fd6e1e6..dec83d49b99cb 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -17,6 +17,7 @@
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Support/GraphWriter.h"
using namespace llvm;
@@ -38,7 +39,7 @@ static cl::opt<bool>
static void writeMCFGToDotFile(MachineFunction &MF) {
std::string Filename =
- (MCFGDotFilenamePrefix + "." + MF.getName() + ".dot").str();
+ (Twine(MCFGDotFilenamePrefix) + "." + MF.getName() + ".dot").str();
errs() << "Writing '" << Filename << "'...";
std::error_code EC;
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index b8dd76d91dee2..df220a9699f90 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -1843,8 +1843,8 @@ bool FileCheck::readCheckFile(
for (StringRef PatternString : Req.ImplicitCheckNot) {
// Create a buffer with fake command line content in order to display the
// command line option responsible for the specific implicit CHECK-NOT.
- std::string Prefix = "-implicit-check-not='";
- std::string Suffix = "'";
+ StringRef Prefix = "-implicit-check-not='";
+ StringRef Suffix = "'";
std::unique_ptr<MemoryBuffer> CmdLine = MemoryBuffer::getMemBufferCopy(
(Prefix + PatternString + Suffix).str(), "command line");
@@ -2592,7 +2592,8 @@ Error FileCheckPatternContext::defineCmdlineVariables(
// Append a copy of the command-line definition adapted to use the same
// format as in the input file to be able to reuse
// parseNumericSubstitutionBlock.
- CmdlineDefsDiag += (DefPrefix + CmdlineDef + " (parsed as: [[").str();
+ CmdlineDefsDiag +=
+ (Twine(DefPrefix) + CmdlineDef + " (parsed as: [[").str();
std::string SubstitutionStr = std::string(CmdlineDef);
SubstitutionStr[EqIdx] = ':';
CmdlineDefsIndices.push_back(
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index 8bfe3a6a7cc4a..ff584568d3cd9 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,6 +12,7 @@
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
#include "llvm/Support/ErrorHandling.h"
@@ -241,7 +242,7 @@ std::string prettifyFunctionName(StringRef FunctionName) {
auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
if (LineNo == 0)
return FunctionName.str();
- return ("omp target in " + ParentName + " @ " + std::to_string(LineNo) +
+ return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
" (" + FunctionName + ")")
.str();
}
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 3a8125b835e53..89dc139f80407 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4656,7 +4656,7 @@ Expected<Function *> OpenMPIRBuilder::emitGlobalToListReduceFunction(
std::string OpenMPIRBuilder::getReductionFuncName(StringRef Name) const {
std::string Suffix =
createPlatformSpecificName({"omp", "reduction", "reduction_func"});
- return (Name + Suffix).str();
+ return (Twine(Name) + Suffix).str();
}
Expected<Function *> OpenMPIRBuilder::createReductionFunction(
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 43651371e730d..dedbc55d51c00 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7935,7 +7935,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
// to fix more IR than it breaks.
// Intel MCU is an exception and uses 4-byte-alignment.
if (!T.isOSIAMCU()) {
- std::string I128 = "-i128:128";
+ StringRef I128 = "-i128:128";
if (StringRef Ref = Res; !Ref.contains(I128)) {
SmallVector<StringRef, 4> Groups;
Regex R("^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
diff --git a/llvm/lib/Support/CodeGenCoverage.cpp b/llvm/lib/Support/CodeGenCoverage.cpp
index 2e35019e12c16..e1b04bbc64e16 100644
--- a/llvm/lib/Support/CodeGenCoverage.cpp
+++ b/llvm/lib/Support/CodeGenCoverage.cpp
@@ -83,9 +83,8 @@ bool CodeGenCoverage::emit(StringRef CoveragePrefix,
// We can handle locking within a process easily enough but we don't want to
// manage it between multiple processes. Use the process ID to ensure no
// more than one process is ever writing to the same file at the same time.
- std::string Pid = llvm::to_string(sys::Process::getProcessId());
-
- std::string CoverageFilename = (CoveragePrefix + Pid).str();
+ std::string CoverageFilename =
+ (CoveragePrefix + Twine(sys::Process::getProcessId())).str();
std::error_code EC;
sys::fs::OpenFlags OpenFlags = sys::fs::OF_Append;
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp
index 5d0a3949e60ca..27004c0c0af13 100644
--- a/llvm/lib/Support/VirtualFileSystem.cpp
+++ b/llvm/lib/Support/VirtualFileSystem.cpp
@@ -707,7 +707,7 @@ class InMemoryFile : public InMemoryNode {
llvm::MemoryBuffer *getBuffer() const { return Buffer.get(); }
std::string toString(unsigned Indent) const override {
- return (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+ return (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
}
static bool classof(const InMemoryNode *N) {
@@ -829,7 +829,7 @@ class InMemoryDirectory : public InMemoryNode {
std::string toString(unsigned Indent) const override {
std::string Result =
- (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+ (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
for (const auto &Entry : Entries)
Result += Entry.second->toString(Indent + 2);
return Result;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index 467fdbfd0e05b..e30c2a262eede 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,6 +16,7 @@
#include "ARMInstPrinter.h"
#include "ARMMCAsmInfo.h"
#include "TargetInfo/ARMTargetInfo.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCCodeEmitter.h"
@@ -144,7 +145,8 @@ std::string ARM_MC::ParseARMTriple(const Triple &TT, StringRef CPU) {
ARM::ArchKind ArchID = ARM::parseArch(TT.getArchName());
if (ArchID != ARM::ArchKind::INVALID && (CPU.empty() || CPU == "generic"))
- ARMArchFeature = (ARMArchFeature + "+" + ARM::getArchName(ArchID)).str();
+ ARMArchFeature =
+ (Twine(ARMArchFeature) + "+" + ARM::getArchName(ArchID)).str();
if (TT.isThumb()) {
if (!ARMArchFeature.empty())
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 9d2904dec0ad0..0599796dc79dc 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,6 +16,7 @@
#include "M68kMCAsmInfo.h"
#include "TargetInfo/M68kTargetInfo.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCELFStreamer.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCInstrInfo.h"
@@ -62,7 +63,7 @@ static MCSubtargetInfo *createM68kMCSubtargetInfo(const Triple &TT,
std::string ArchFS = ParseM68kTriple(TT, CPU);
if (!FS.empty()) {
if (!ArchFS.empty()) {
- ArchFS = (ArchFS + "," + FS).str();
+ ArchFS = (Twine(ArchFS) + "," + FS).str();
} else {
ArchFS = FS.str();
}
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 84196697060e3..3a9301b664dab 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,6 +17,7 @@
#include "SPIRVUtils.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringTable.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/IntrinsicsSPIRV.h"
#include <regex>
@@ -339,12 +340,12 @@ lookupBuiltin(StringRef DemangledCall,
// If argument-type name prefix was added, look up the builtin again.
if (!Prefix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((Prefix + BuiltinName).str(), Set)))
+ (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
if (!Suffix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((BuiltinName + Suffix).str(), Set)))
+ (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 84bab9487f0c8..44b756109e9b2 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,6 +29,7 @@
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/BinaryFormat/Wasm.h"
#include "llvm/CodeGen/Analysis.h"
@@ -589,7 +590,7 @@ void WebAssemblyAsmPrinter::EmitTargetFeatures(Module &M) {
// Read target features and linkage policies from module metadata
SmallVector<FeatureEntry, 4> EmittedFeatures;
auto EmitFeature = [&](std::string Feature) {
- std::string MDKey = (StringRef("wasm-feature-") + Feature).str();
+ std::string MDKey = (Twine("wasm-feature-") + Feature).str();
Metadata *Policy = M.getModuleFlag(MDKey);
if (Policy == nullptr)
return;
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
index 210b1266de23c..c45c804ad6cca 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
@@ -213,7 +213,8 @@ bool SanitizerBinaryMetadata::run() {
// Calls to the initialization functions with different versions cannot be
// merged. Give the structors unique names based on the version, which will
// also be used as the COMDAT key.
- const std::string StructorPrefix = (MI->FunctionPrefix + VersionStr).str();
+ const std::string StructorPrefix =
+ (Twine(MI->FunctionPrefix) + VersionStr).str();
// We declare the _add and _del functions as weak, and only call them if
// there is a valid symbol linked. This allows building binaries with
>From 4d766e71a9125fd2e23ce9d440ffb586acfa929c Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Fri, 2 Oct 2026 13:21:13 +0000
Subject: [PATCH 6/7] format code
---
llvm/lib/CodeGen/MachineCFGPrinter.cpp | 2 +-
llvm/lib/Frontend/OpenMP/OMP.cpp | 4 ++--
llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 8 ++++----
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index dec83d49b99cb..e43be28e61f57 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -12,12 +12,12 @@
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/MachineCFGPrinter.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Support/GraphWriter.h"
using namespace llvm;
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index ff584568d3cd9..936fb029ed757 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -242,8 +242,8 @@ std::string prettifyFunctionName(StringRef FunctionName) {
auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
if (LineNo == 0)
return FunctionName.str();
- return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
- " (" + FunctionName + ")")
+ return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) + " (" +
+ FunctionName + ")")
.str();
}
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 3a9301b664dab..70971a08f6859 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -339,13 +339,13 @@ lookupBuiltin(StringRef DemangledCall,
}
// If argument-type name prefix was added, look up the builtin again.
- if (!Prefix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
+ if (!Prefix.empty() && (Builtin = SPIRV::lookupBuiltin(
+ (Twine(Prefix) + BuiltinName).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
- if (!Suffix.empty() &&
- (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
+ if (!Suffix.empty() && (Builtin = SPIRV::lookupBuiltin(
+ (Twine(BuiltinName) + Suffix).str(), Set)))
return std::make_unique<SPIRV::IncomingCall>(
BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
}
>From 58e4ae3e0b10f6916bbe0a79d0423a65615865ea Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Sun, 4 Oct 2026 20:06:28 +0000
Subject: [PATCH 7/7] remove redundant includes
---
llvm/include/llvm/Analysis/ReleaseModeModelRunner.h | 1 -
llvm/lib/Analysis/ReplayInlineAdvisor.cpp | 1 -
llvm/lib/CodeGen/MachineCFGPrinter.cpp | 1 -
llvm/lib/Frontend/OpenMP/OMP.cpp | 1 -
llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp | 1 -
llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp | 1 -
llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 1 -
llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 1 -
8 files changed, 8 deletions(-)
diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index 3ca3205406946..9b9d1392371d6 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,7 +15,6 @@
#define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/MLModelRunner.h"
#include "llvm/Analysis/TensorSpec.h"
#include "llvm/Support/ErrorHandling.h"
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 1b4f159105342..842e9b5b676d2 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,7 +14,6 @@
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/ReplayInlineAdvisor.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/LineIterator.h"
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index e43be28e61f57..196f7a42198ee 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/MachineCFGPrinter.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index 936fb029ed757..302a66c0af93f 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,7 +12,6 @@
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
#include "llvm/Support/ErrorHandling.h"
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index e30c2a262eede..3bd39d2d97109 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,7 +16,6 @@
#include "ARMInstPrinter.h"
#include "ARMMCAsmInfo.h"
#include "TargetInfo/ARMTargetInfo.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/DebugInfo/CodeView/CodeView.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCCodeEmitter.h"
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 0599796dc79dc..f43d56ad6baf3 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,7 +16,6 @@
#include "M68kMCAsmInfo.h"
#include "TargetInfo/M68kTargetInfo.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCELFStreamer.h"
#include "llvm/MC/MCInstPrinter.h"
#include "llvm/MC/MCInstrInfo.h"
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 70971a08f6859..ef41e2fa63981 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,7 +17,6 @@
#include "SPIRVUtils.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringTable.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/IntrinsicsSPIRV.h"
#include <regex>
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 44b756109e9b2..1945a7f10909f 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,7 +29,6 @@
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/BinaryFormat/Wasm.h"
#include "llvm/CodeGen/Analysis.h"
More information about the llvm-commits
mailing list