Skip to content

Commit

Permalink
Revert "[ADT] Make Twine's copy constructor private."
Browse files Browse the repository at this point in the history
This reverts commit 4e4ee1c507e2707bb3c208e1e1b6551c3015cbf5.

This is failing due to some code that isn't built on MSVC
so I didn't catch.  Not immediately obvious how to fix this
at first glance, so I'm reverting for now.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315536 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Zachary Turner committed Oct 11, 2017
1 parent 1c59d02 commit d411842
Show file tree
Hide file tree
Showing 17 changed files with 47 additions and 72 deletions.
37 changes: 9 additions & 28 deletions include/llvm/ADT/Twine.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,6 @@ namespace llvm {
/// overloads) to guarantee that particularly important cases (cstring plus
/// StringRef) codegen as desired.
class Twine {
friend Twine operator+(const char *LHS, const StringRef &RHS);
friend Twine operator+(const StringRef &LHS, const char *RHS);
friend Twine operator+(const StringRef &LHS, const StringRef &RHS);

/// NodeKind - Represent the type of an argument.
enum NodeKind : unsigned char {
/// An empty string; the result of concatenating anything with it is also
Expand Down Expand Up @@ -173,12 +169,6 @@ namespace llvm {
assert(isNullary() && "Invalid kind!");
}

// While there are some valid use cases for copying Twines, most of them
// are confined to the implementation of Twine itself, and Twine itself is
// not intended to be publicly copyable since it can very easily lead to
// dangling pointers / references.
Twine(const Twine &) = default;

/// Construct a binary twine.
explicit Twine(const Twine &LHS, const Twine &RHS)
: LHSKind(TwineKind), RHSKind(TwineKind) {
Expand Down Expand Up @@ -266,6 +256,8 @@ namespace llvm {
assert(isValid() && "Invalid twine!");
}

Twine(const Twine &) = default;

/// Construct from a C string.
///
/// We take care here to optimize "" into the empty twine -- this will be
Expand All @@ -282,8 +274,6 @@ namespace llvm {
assert(isValid() && "Invalid twine!");
}

Twine(Twine &&Other) = default;

/// Construct from an std::string.
/*implicit*/ Twine(const std::string &Str)
: LHSKind(StdStringKind), RHSKind(EmptyKind) {
Expand Down Expand Up @@ -387,14 +377,6 @@ namespace llvm {
assert(isValid() && "Invalid twine!");
}

/// Construct as the concatenation of two StringRefs.
/*implicit*/ Twine(const StringRef &LHS, const StringRef &RHS)
: LHSKind(StringRefKind), RHSKind(StringRefKind) {
this->LHS.stringRef = &LHS;
this->RHS.stringRef = &RHS;
assert(isValid() && "Invalid twine!");
}

/// Since the intended use of twines is as temporary objects, assignments
/// when concatenating might cause undefined behavior or stack corruptions
Twine &operator=(const Twine &) = delete;
Expand Down Expand Up @@ -505,10 +487,6 @@ namespace llvm {
/// Dump the representation of this twine to stderr.
void dumpRepr() const;

friend inline Twine operator+(const Twine &LHS, const Twine &RHS) {
return LHS.concat(RHS);
}

/// @}
};

Expand Down Expand Up @@ -544,18 +522,21 @@ namespace llvm {
return Twine(NewLHS, NewLHSKind, NewRHS, NewRHSKind);
}

inline Twine operator+(const Twine &LHS, const Twine &RHS) {
return LHS.concat(RHS);
}

/// Additional overload to guarantee simplified codegen; this is equivalent to
/// concat().

inline Twine operator+(const char *LHS, const StringRef &RHS) {
return Twine(LHS, RHS);
}

inline Twine operator+(const StringRef &LHS, const char *RHS) {
return Twine(LHS, RHS);
}
/// Additional overload to guarantee simplified codegen; this is equivalent to
/// concat().

inline Twine operator+(const StringRef &LHS, const StringRef &RHS) {
inline Twine operator+(const StringRef &LHS, const char *RHS) {
return Twine(LHS, RHS);
}

Expand Down
6 changes: 3 additions & 3 deletions include/llvm/IR/DiagnosticInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -962,7 +962,7 @@ class DiagnosticInfoOptimizationFailure : public DiagnosticInfoIROptimization {
/// Diagnostic information for unsupported feature in backend.
class DiagnosticInfoUnsupported : public DiagnosticInfoWithLocationBase {
private:
std::string Msg;
Twine Msg;

public:
/// \p Fn is the function where the diagnostic is being emitted. \p Loc is
Expand All @@ -976,13 +976,13 @@ class DiagnosticInfoUnsupported : public DiagnosticInfoWithLocationBase {
const DiagnosticLocation &Loc = DiagnosticLocation(),
DiagnosticSeverity Severity = DS_Error)
: DiagnosticInfoWithLocationBase(DK_Unsupported, Severity, Fn, Loc),
Msg(Msg.str()) {}
Msg(Msg) {}

static bool classof(const DiagnosticInfo *DI) {
return DI->getKind() == DK_Unsupported;
}

StringRef getMessage() const { return Msg; }
const Twine &getMessage() const { return Msg; }

void print(DiagnosticPrinter &DP) const override;
};
Expand Down
4 changes: 2 additions & 2 deletions include/llvm/Object/Error.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ class BinaryError : public ErrorInfo<BinaryError, ECError> {
class GenericBinaryError : public ErrorInfo<GenericBinaryError, BinaryError> {
public:
static char ID;
GenericBinaryError(const Twine &Msg);
GenericBinaryError(const Twine &Msg, object_error ECOverride);
GenericBinaryError(Twine Msg);
GenericBinaryError(Twine Msg, object_error ECOverride);
const std::string &getMessage() const { return Msg; }
void log(raw_ostream &OS) const override;
private:
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/Object/WindowsResource.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ struct WinResHeaderSuffix {

class EmptyResError : public GenericBinaryError {
public:
EmptyResError(const Twine &Msg, object_error ECOverride)
EmptyResError(Twine Msg, object_error ECOverride)
: GenericBinaryError(Msg, ECOverride) {}
};

Expand Down
2 changes: 1 addition & 1 deletion include/llvm/Support/Error.h
Original file line number Diff line number Diff line change
Expand Up @@ -931,7 +931,7 @@ Expected<T> handleExpected(Expected<T> ValOrErr, RecoveryFtor &&RecoveryPath,
/// This is useful in the base level of your program to allow clean termination
/// (allowing clean deallocation of resources, etc.), while reporting error
/// information to the user.
void logAllUnhandledErrors(Error E, raw_ostream &OS, const Twine &ErrorBanner);
void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner);

/// Write all error messages (if any) in E to a string. The newline character
/// is used to separate error messages.
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/Support/FormatVariadicDetails.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class format_adapter {
};

template <typename T> class provider_format_adapter : public format_adapter {
T &Item;
T Item;

public:
explicit provider_format_adapter(T &&Item) : Item(Item) {}
Expand Down
5 changes: 2 additions & 3 deletions lib/Object/Error.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,9 @@ std::string _object_error_category::message(int EV) const {
char BinaryError::ID = 0;
char GenericBinaryError::ID = 0;

GenericBinaryError::GenericBinaryError(const Twine &Msg) : Msg(Msg.str()) {}
GenericBinaryError::GenericBinaryError(Twine Msg) : Msg(Msg.str()) {}

GenericBinaryError::GenericBinaryError(const Twine &Msg,
object_error ECOverride)
GenericBinaryError::GenericBinaryError(Twine Msg, object_error ECOverride)
: Msg(Msg.str()) {
setErrorCode(make_error_code(ECOverride));
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Support/Error.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ char ErrorList::ID = 0;
char ECError::ID = 0;
char StringError::ID = 0;

void logAllUnhandledErrors(Error E, raw_ostream &OS, const Twine &ErrorBanner) {
void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner) {
if (!E)
return;
OS << ErrorBanner;
Expand Down
6 changes: 4 additions & 2 deletions lib/Support/Twine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,12 @@ void Twine::printOneChildRepr(raw_ostream &OS, Child Ptr,
<< Ptr.cString << "\"";
break;
case Twine::StdStringKind:
OS << "std::string:\"" << *Ptr.stdString << "\"";
OS << "std::string:\""
<< Ptr.stdString << "\"";
break;
case Twine::StringRefKind:
OS << "stringref:\"" << *Ptr.stringRef << "\"";
OS << "stringref:\""
<< Ptr.stringRef << "\"";
break;
case Twine::SmallStringKind:
OS << "smallstring:\"" << *Ptr.smallString << "\"";
Expand Down
21 changes: 11 additions & 10 deletions lib/Transforms/Scalar/SROA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,15 +130,18 @@ namespace {
class IRBuilderPrefixedInserter : public IRBuilderDefaultInserter {
std::string Prefix;

const Twine getNameWithPrefix(const Twine &Name) const {
return Name.isTriviallyEmpty() ? Name : Prefix + Name;
}

public:
void SetNamePrefix(const Twine &P) { Prefix = P.str(); }

protected:
void InsertHelper(Instruction *I, const Twine &Name, BasicBlock *BB,
BasicBlock::iterator InsertPt) const {
const Twine &Prefixed = Prefix + Name;
IRBuilderDefaultInserter::InsertHelper(
I, Name.isTriviallyEmpty() ? Name : Prefixed, BB, InsertPt);
IRBuilderDefaultInserter::InsertHelper(I, getNameWithPrefix(Name), BB,
InsertPt);
}
};

Expand Down Expand Up @@ -1352,8 +1355,7 @@ static void speculateSelectInstLoads(SelectInst &SI) {
/// This will return the BasePtr if that is valid, or build a new GEP
/// instruction using the IRBuilder if GEP-ing is needed.
static Value *buildGEP(IRBuilderTy &IRB, Value *BasePtr,
SmallVectorImpl<Value *> &Indices,
const Twine &NamePrefix) {
SmallVectorImpl<Value *> &Indices, Twine NamePrefix) {
if (Indices.empty())
return BasePtr;

Expand All @@ -1378,7 +1380,7 @@ static Value *buildGEP(IRBuilderTy &IRB, Value *BasePtr,
static Value *getNaturalGEPWithType(IRBuilderTy &IRB, const DataLayout &DL,
Value *BasePtr, Type *Ty, Type *TargetTy,
SmallVectorImpl<Value *> &Indices,
const Twine &NamePrefix) {
Twine NamePrefix) {
if (Ty == TargetTy)
return buildGEP(IRB, BasePtr, Indices, NamePrefix);

Expand Down Expand Up @@ -1423,7 +1425,7 @@ static Value *getNaturalGEPRecursively(IRBuilderTy &IRB, const DataLayout &DL,
Value *Ptr, Type *Ty, APInt &Offset,
Type *TargetTy,
SmallVectorImpl<Value *> &Indices,
const Twine &NamePrefix) {
Twine NamePrefix) {
if (Offset == 0)
return getNaturalGEPWithType(IRB, DL, Ptr, Ty, TargetTy, Indices,
NamePrefix);
Expand Down Expand Up @@ -1496,7 +1498,7 @@ static Value *getNaturalGEPRecursively(IRBuilderTy &IRB, const DataLayout &DL,
static Value *getNaturalGEPWithOffset(IRBuilderTy &IRB, const DataLayout &DL,
Value *Ptr, APInt Offset, Type *TargetTy,
SmallVectorImpl<Value *> &Indices,
const Twine &NamePrefix) {
Twine NamePrefix) {
PointerType *Ty = cast<PointerType>(Ptr->getType());

// Don't consider any GEPs through an i8* as natural unless the TargetTy is
Expand Down Expand Up @@ -1534,8 +1536,7 @@ static Value *getNaturalGEPWithOffset(IRBuilderTy &IRB, const DataLayout &DL,
/// a single GEP as possible, thus making each GEP more independent of the
/// surrounding code.
static Value *getAdjustedPtr(IRBuilderTy &IRB, const DataLayout &DL, Value *Ptr,
APInt Offset, Type *PointerTy,
const Twine &NamePrefix) {
APInt Offset, Type *PointerTy, Twine NamePrefix) {
// Even though we don't look through PHI nodes, we could be called on an
// instruction in an unreachable block, which may be on a cycle.
SmallPtrSet<Value *, 4> Visited;
Expand Down
4 changes: 2 additions & 2 deletions tools/llvm-nm/llvm-nm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,12 +195,12 @@ bool HadError = false;
std::string ToolName;
} // anonymous namespace

static void error(const Twine &Message, const Twine &Path = Twine()) {
static void error(Twine Message, Twine Path = Twine()) {
HadError = true;
errs() << ToolName << ": " << Path << ": " << Message << ".\n";
}

static bool error(std::error_code EC, const Twine &Path = Twine()) {
static bool error(std::error_code EC, Twine Path = Twine()) {
if (EC) {
error(EC.message(), Path);
return true;
Expand Down
6 changes: 3 additions & 3 deletions tools/llvm-objcopy/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -428,15 +428,15 @@ void initRelocations(RelocationSection<ELFT> *Relocs,
}
}

SectionBase *SectionTableRef::getSection(uint16_t Index, const Twine &ErrMsg) {
SectionBase *SectionTableRef::getSection(uint16_t Index, Twine ErrMsg) {
if (Index == SHN_UNDEF || Index > Sections.size())
error(ErrMsg);
return Sections[Index - 1].get();
}

template <class T>
T *SectionTableRef::getSectionOfType(uint16_t Index, const Twine &IndexErrMsg,
const Twine &TypeErrMsg) {
T *SectionTableRef::getSectionOfType(uint16_t Index, Twine IndexErrMsg,
Twine TypeErrMsg) {
if (T *Sec = llvm::dyn_cast<T>(getSection(Index, IndexErrMsg)))
return Sec;
error(TypeErrMsg);
Expand Down
6 changes: 3 additions & 3 deletions tools/llvm-objcopy/Object.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ class SectionTableRef {
: Sections(Secs) {}
SectionTableRef(const SectionTableRef &) = default;

SectionBase *getSection(uint16_t Index, const llvm::Twine &ErrMsg);
SectionBase *getSection(uint16_t Index, llvm::Twine ErrMsg);

template <class T>
T *getSectionOfType(uint16_t Index, const llvm::Twine &IndexErrMsg,
const llvm::Twine &TypeErrMsg);
T *getSectionOfType(uint16_t Index, llvm::Twine IndexErrMsg,
llvm::Twine TypeErrMsg);
};

class SectionBase {
Expand Down
2 changes: 1 addition & 1 deletion tools/llvm-objcopy/llvm-objcopy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ static StringRef ToolName;

namespace llvm {

LLVM_ATTRIBUTE_NORETURN void error(const Twine &Message) {
LLVM_ATTRIBUTE_NORETURN void error(Twine Message) {
errs() << ToolName << ": " << Message << ".\n";
errs().flush();
exit(1);
Expand Down
2 changes: 1 addition & 1 deletion tools/llvm-objcopy/llvm-objcopy.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

namespace llvm {

LLVM_ATTRIBUTE_NORETURN extern void error(const Twine &Message);
LLVM_ATTRIBUTE_NORETURN extern void error(Twine Message);

// This is taken from llvm-readobj.
// [see here](llvm/tools/llvm-readobj/llvm-readobj.h:38)
Expand Down
8 changes: 0 additions & 8 deletions unittests/ADT/TwineTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,6 @@ TEST(TwineTest, Concat) {
repr(Twine("a").concat(Twine(SmallString<3>("b")).concat(Twine("c")))));
}

TEST(TwineTest, Operators) {
EXPECT_EQ(R"((Twine cstring:"a" stringref:"b"))", repr("a" + StringRef("b")));

EXPECT_EQ(R"((Twine stringref:"a" cstring:"b"))", repr(StringRef("a") + "b"));
EXPECT_EQ(R"((Twine stringref:"a" stringref:"b"))",
repr(StringRef("a") + StringRef("b")));
}

TEST(TwineTest, toNullTerminatedStringRef) {
SmallString<8> storage;
EXPECT_EQ(0, *Twine("hello").toNullTerminatedStringRef(storage).end());
Expand Down
4 changes: 2 additions & 2 deletions utils/TableGen/RegisterBankEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ void RegisterBankEmitter::emitBaseClassDefinition(
/// to the class.
static void visitRegisterBankClasses(
CodeGenRegBank &RegisterClassHierarchy, const CodeGenRegisterClass *RC,
const Twine &Kind,
const Twine Kind,
std::function<void(const CodeGenRegisterClass *, StringRef)> VisitFn,
SmallPtrSetImpl<const CodeGenRegisterClass *> &VisitedRCs) {

Expand All @@ -183,7 +183,7 @@ static void visitRegisterBankClasses(

for (const auto &PossibleSubclass : RegisterClassHierarchy.getRegClasses()) {
std::string TmpKind =
(Kind + " (" + PossibleSubclass.getName() + ")").str();
(Twine(Kind) + " (" + PossibleSubclass.getName() + ")").str();

// Visit each subclass of an explicitly named class.
if (RC != &PossibleSubclass && RC->hasSubClass(&PossibleSubclass))
Expand Down

0 comments on commit d411842

Please sign in to comment.