From eefbe59844fe4553d03b064ccc95e7c761b122c7 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Tue, 20 Jan 2015 02:54:07 +0000 Subject: [PATCH] IR: Simplify DIBuilder's HeaderBuilder API, NFC Change `HeaderBuilder` API to work well even when it's not starting with a tag. There's already one case like this, and the tag is moving elsewhere as part of PR22235. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226540 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/DIBuilder.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp index eb686aa4bec..c6df3409a47 100644 --- a/lib/IR/DIBuilder.cpp +++ b/lib/IR/DIBuilder.cpp @@ -25,15 +25,23 @@ using namespace llvm::dwarf; namespace { class HeaderBuilder { + /// \brief Whether there are any fields yet. + /// + /// Note that this is not equivalent to \c Chars.empty(), since \a concat() + /// may have been called already with an empty string. + bool IsEmpty; SmallVector Chars; public: - explicit HeaderBuilder(Twine T) { T.toVector(Chars); } + HeaderBuilder() : IsEmpty(true) {} HeaderBuilder(const HeaderBuilder &X) : Chars(X.Chars) {} HeaderBuilder(HeaderBuilder &&X) : Chars(std::move(X.Chars)) {} template HeaderBuilder &concat(Twineable &&X) { - Chars.push_back(0); + if (IsEmpty) + IsEmpty = false; + else + Chars.push_back(0); Twine(X).toVector(Chars); return *this; } @@ -43,7 +51,7 @@ public: } static HeaderBuilder get(unsigned Tag) { - return HeaderBuilder("0x" + Twine::utohexstr(Tag)); + return HeaderBuilder().concat("0x" + Twine::utohexstr(Tag)); } }; } @@ -739,8 +747,10 @@ static HeaderBuilder setTypeFlagsInHeader(StringRef Header, Flags = 0; Flags |= FlagsToSet; - return HeaderBuilder(Twine(I.getPrefix())).concat(Flags).concat( - I.getSuffix()); + return HeaderBuilder() + .concat(I.getPrefix()) + .concat(Flags) + .concat(I.getSuffix()); } static DIType createTypeWithFlags(LLVMContext &Context, DIType Ty, -- 2.11.0