From: Rafael Espindola Date: Fri, 11 Feb 2011 02:52:17 +0000 (+0000) Subject: For consistency, use llvm::raw_ostream in the rest of the mangle api. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f0be979bddb8baa28e77693a3dc931e487b2a9f2;p=clang For consistency, use llvm::raw_ostream in the rest of the mangle api. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125360 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Mangle.h b/include/clang/AST/Mangle.h index 747a0b121a..7af7702027 100644 --- a/include/clang/AST/Mangle.h +++ b/include/clang/AST/Mangle.h @@ -98,21 +98,21 @@ public: virtual void mangleName(const NamedDecl *D, llvm::raw_ostream &)=0; virtual void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, - llvm::SmallVectorImpl &) = 0; + llvm::raw_ostream &) = 0; virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, const ThisAdjustment &ThisAdjustment, - llvm::SmallVectorImpl &) = 0; + llvm::raw_ostream &) = 0; virtual void mangleReferenceTemporary(const VarDecl *D, - llvm::SmallVectorImpl &) = 0; + llvm::raw_ostream &) = 0; virtual void mangleCXXVTable(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &) = 0; + llvm::raw_ostream &) = 0; virtual void mangleCXXVTT(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &) = 0; + llvm::raw_ostream &) = 0; virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, const CXXRecordDecl *Type, - llvm::SmallVectorImpl &) = 0; - virtual void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl &) = 0; - virtual void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl &) = 0; + llvm::raw_ostream &) = 0; + virtual void mangleCXXRTTI(QualType T, llvm::raw_ostream &) = 0; + virtual void mangleCXXRTTIName(QualType T, llvm::raw_ostream &) = 0; virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type, llvm::raw_ostream &) = 0; virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type, @@ -130,11 +130,11 @@ public: void mangleBlock(const BlockDecl *BD, llvm::raw_ostream &Out); void mangleObjCMethodName(const ObjCMethodDecl *MD, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); // This is pretty lame. virtual void mangleItaniumGuardVariable(const VarDecl *D, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { assert(0 && "Target does not support mangling guard variables"); } /// @} diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 6205988c91..7d641e45c1 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -94,28 +94,27 @@ public: void mangleName(const NamedDecl *D, llvm::raw_ostream &); void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, const ThisAdjustment &ThisAdjustment, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); void mangleReferenceTemporary(const VarDecl *D, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); void mangleCXXVTable(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); void mangleCXXVTT(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, const CXXRecordDecl *Type, - llvm::SmallVectorImpl &); - void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl &); - void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl &); + llvm::raw_ostream &); + void mangleCXXRTTI(QualType T, llvm::raw_ostream &); + void mangleCXXRTTIName(QualType T, llvm::raw_ostream &); void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type, llvm::raw_ostream &); void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type, llvm::raw_ostream &); - void mangleItaniumGuardVariable(const VarDecl *D, - llvm::SmallVectorImpl &); + void mangleItaniumGuardVariable(const VarDecl *D, llvm::raw_ostream &); void mangleInitDiscriminator() { Discriminator = 0; @@ -1188,9 +1187,7 @@ void CXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) { } void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { - llvm::SmallString<64> Buffer; - Context.mangleObjCMethodName(MD, Buffer); - Out << Buffer; + Context.mangleObjCMethodName(MD, Out); } void CXXNameMangler::mangleType(QualType nonCanon) { @@ -2567,7 +2564,7 @@ void ItaniumMangleContext::mangleCXXDtor(const CXXDestructorDecl *D, void ItaniumMangleContext::mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= T // # base is the nominal target function of thunk // ::= Tc @@ -2577,7 +2574,6 @@ void ItaniumMangleContext::mangleThunk(const CXXMethodDecl *MD, assert(!isa(MD) && "Use mangleCXXDtor for destructor decls!"); - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZT"; if (!Thunk.Return.isEmpty()) @@ -2598,11 +2594,9 @@ void ItaniumMangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, const ThisAdjustment &ThisAdjustment, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= T // # base is the nominal target function of thunk - - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out, DD, Type); Mangler.getStream() << "_ZT"; @@ -2616,38 +2610,34 @@ ItaniumMangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *DD, /// mangleGuardVariable - Returns the mangled name for a guard variable /// for the passed in VarDecl. void ItaniumMangleContext::mangleItaniumGuardVariable(const VarDecl *D, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= GV # Guard variable for one-time // # initialization - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZGV"; Mangler.mangleName(D); } void ItaniumMangleContext::mangleReferenceTemporary(const VarDecl *D, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // We match the GCC mangling here. // ::= GR - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZGR"; Mangler.mangleName(D); } void ItaniumMangleContext::mangleCXXVTable(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= TV # virtual table - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZTV"; Mangler.mangleNameOrStandardSubstitution(RD); } void ItaniumMangleContext::mangleCXXVTT(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= TT # VTT structure - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZTT"; Mangler.mangleNameOrStandardSubstitution(RD); @@ -2656,9 +2646,8 @@ void ItaniumMangleContext::mangleCXXVTT(const CXXRecordDecl *RD, void ItaniumMangleContext::mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, const CXXRecordDecl *Type, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= TC _ - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZTC"; Mangler.mangleNameOrStandardSubstitution(RD); @@ -2668,19 +2657,17 @@ void ItaniumMangleContext::mangleCXXCtorVTable(const CXXRecordDecl *RD, } void ItaniumMangleContext::mangleCXXRTTI(QualType Ty, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= TI # typeinfo structure assert(!Ty.hasQualifiers() && "RTTI info cannot have top-level qualifiers"); - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZTI"; Mangler.mangleType(Ty); } void ItaniumMangleContext::mangleCXXRTTIName(QualType Ty, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { // ::= TS # typeinfo name (null terminated byte string) - llvm::raw_svector_ostream Out(Res); CXXNameMangler Mangler(*this, Out); Mangler.getStream() << "_ZTS"; Mangler.mangleType(Ty); diff --git a/lib/AST/Mangle.cpp b/lib/AST/Mangle.cpp index a84c2a6f6a..3a0b909430 100644 --- a/lib/AST/Mangle.cpp +++ b/lib/AST/Mangle.cpp @@ -87,30 +87,30 @@ void MangleContext::mangleBlock(const DeclContext *DC, const BlockDecl *BD, checkMangleDC(DC, BD); llvm::SmallString<64> Buffer; + llvm::raw_svector_ostream Stream(Buffer); if (const ObjCMethodDecl *Method = dyn_cast(DC)) { - mangleObjCMethodName(Method, Buffer); + mangleObjCMethodName(Method, Stream); } else { const NamedDecl *ND = cast(DC); if (IdentifierInfo *II = ND->getIdentifier()) - Buffer = II->getName(); + Stream << II->getName(); else { // FIXME: We were doing a mangleUnqualifiedName() before, but that's // a private member of a class that will soon itself be private to the // Itanium C++ ABI object. What should we do now? Right now, I'm just // calling the mangleName() method on the MangleContext; is there a // better way? - llvm::raw_svector_ostream Out(Buffer); - mangleName(ND, Out); + mangleName(ND, Stream); } } - + Stream.flush(); mangleFunctionBlock(*this, Buffer, BD, Out); } void MangleContext::mangleObjCMethodName(const ObjCMethodDecl *MD, - llvm::SmallVectorImpl &Res) { + llvm::raw_ostream &Out) { llvm::SmallString<64> Name; - llvm::raw_svector_ostream OS(Name), Out(Res); + llvm::raw_svector_ostream OS(Name); const ObjCContainerDecl *CD = dyn_cast(MD->getDeclContext()); diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 7f477e5a2f..7aafac0ad0 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -83,25 +83,25 @@ public: virtual void mangleName(const NamedDecl *D, llvm::raw_ostream &Out); virtual void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, const ThisAdjustment &ThisAdjustment, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); virtual void mangleCXXVTable(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); virtual void mangleCXXVTT(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, const CXXRecordDecl *Type, - llvm::SmallVectorImpl &); - virtual void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl &); - virtual void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl &); + llvm::raw_ostream &); + virtual void mangleCXXRTTI(QualType T, llvm::raw_ostream &); + virtual void mangleCXXRTTIName(QualType T, llvm::raw_ostream &); virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type, llvm::raw_ostream &); virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type, llvm::raw_ostream &); virtual void mangleReferenceTemporary(const clang::VarDecl *, - llvm::SmallVectorImpl &); + llvm::raw_ostream &); }; } @@ -529,9 +529,7 @@ void MicrosoftCXXNameMangler::mangleSourceName(const IdentifierInfo *II) { } void MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { - llvm::SmallString<64> Buffer; - Context.mangleObjCMethodName(MD, Buffer); - Out << Buffer; + Context.mangleObjCMethodName(MD, Out); } void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals, @@ -1137,35 +1135,35 @@ void MicrosoftMangleContext::mangleName(const NamedDecl *D, } void MicrosoftMangleContext::mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { assert(false && "Can't yet mangle thunks!"); } void MicrosoftMangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, const ThisAdjustment &, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { assert(false && "Can't yet mangle destructor thunks!"); } void MicrosoftMangleContext::mangleCXXVTable(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { assert(false && "Can't yet mangle virtual tables!"); } void MicrosoftMangleContext::mangleCXXVTT(const CXXRecordDecl *RD, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { llvm_unreachable("The MS C++ ABI does not have virtual table tables!"); } void MicrosoftMangleContext::mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, const CXXRecordDecl *Type, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { llvm_unreachable("The MS C++ ABI does not have constructor vtables!"); } void MicrosoftMangleContext::mangleCXXRTTI(QualType T, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { assert(false && "Can't yet mangle RTTI!"); } void MicrosoftMangleContext::mangleCXXRTTIName(QualType T, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { assert(false && "Can't yet mangle RTTI names!"); } void MicrosoftMangleContext::mangleCXXCtor(const CXXConstructorDecl *D, @@ -1179,7 +1177,7 @@ void MicrosoftMangleContext::mangleCXXDtor(const CXXDestructorDecl *D, assert(false && "Can't yet mangle destructors!"); } void MicrosoftMangleContext::mangleReferenceTemporary(const clang::VarDecl *, - llvm::SmallVectorImpl &) { + llvm::raw_ostream &) { assert(false && "Can't yet mangle reference temporaries!"); } diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 019a6c524d..e8ac813870 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -178,8 +178,10 @@ CreateReferenceTemporary(CodeGenFunction& CGF, QualType Type, if (const VarDecl *VD = dyn_cast_or_null(InitializedDecl)) { if (VD->hasGlobalStorage()) { llvm::SmallString<256> Name; - CGF.CGM.getCXXABI().getMangleContext().mangleReferenceTemporary(VD, Name); - + llvm::raw_svector_ostream Out(Name); + CGF.CGM.getCXXABI().getMangleContext().mangleReferenceTemporary(VD, Out); + Out.flush(); + const llvm::Type *RefTempTy = CGF.ConvertTypeForMem(Type); // Create the reference temporary. diff --git a/lib/CodeGen/CGRTTI.cpp b/lib/CodeGen/CGRTTI.cpp index c358c48e80..de403b6559 100644 --- a/lib/CodeGen/CGRTTI.cpp +++ b/lib/CodeGen/CGRTTI.cpp @@ -116,7 +116,9 @@ llvm::GlobalVariable * RTTIBuilder::GetAddrOfTypeName(QualType Ty, llvm::GlobalVariable::LinkageTypes Linkage) { llvm::SmallString<256> OutName; - CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, OutName); + llvm::raw_svector_ostream Out(OutName); + CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out); + Out.flush(); llvm::StringRef Name = OutName.str(); // We know that the mangled name of the type starts at index 4 of the @@ -135,7 +137,9 @@ RTTIBuilder::GetAddrOfTypeName(QualType Ty, llvm::Constant *RTTIBuilder::GetAddrOfExternalRTTIDescriptor(QualType Ty) { // Mangle the RTTI name. llvm::SmallString<256> OutName; - CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, OutName); + llvm::raw_svector_ostream Out(OutName); + CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); + Out.flush(); llvm::StringRef Name = OutName.str(); // Look for an existing global. @@ -524,7 +528,9 @@ maybeUpdateRTTILinkage(CodeGenModule &CGM, llvm::GlobalVariable *GV, // Get the typename global. llvm::SmallString<256> OutName; - CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, OutName); + llvm::raw_svector_ostream Out(OutName); + CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out); + Out.flush(); llvm::StringRef Name = OutName.str(); llvm::GlobalVariable *TypeNameGV = CGM.getModule().getNamedGlobal(Name); @@ -542,7 +548,9 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { // Check if we've already emitted an RTTI descriptor for this type. llvm::SmallString<256> OutName; - CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, OutName); + llvm::raw_svector_ostream Out(OutName); + CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out); + Out.flush(); llvm::StringRef Name = OutName.str(); llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name); diff --git a/lib/CodeGen/CGVTT.cpp b/lib/CodeGen/CGVTT.cpp index 604e4cb773..78b2dbe2ba 100644 --- a/lib/CodeGen/CGVTT.cpp +++ b/lib/CodeGen/CGVTT.cpp @@ -393,7 +393,9 @@ llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTT(const CXXRecordDecl *RD) { assert(RD->getNumVBases() && "Only classes with virtual bases need a VTT"); llvm::SmallString<256> OutName; - CGM.getCXXABI().getMangleContext().mangleCXXVTT(RD, OutName); + llvm::raw_svector_ostream Out(OutName); + CGM.getCXXABI().getMangleContext().mangleCXXVTT(RD, Out); + Out.flush(); llvm::StringRef Name = OutName.str(); VTTBuilder Builder(CGM, RD, /*GenerateDefinition=*/false); diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp index 4bf67b53a3..891697f4cd 100644 --- a/lib/CodeGen/CGVTables.cpp +++ b/lib/CodeGen/CGVTables.cpp @@ -2456,12 +2456,14 @@ llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD, // Compute the mangled name. llvm::SmallString<256> Name; + llvm::raw_svector_ostream Out(Name); if (const CXXDestructorDecl* DD = dyn_cast(MD)) getCXXABI().getMangleContext().mangleCXXDtorThunk(DD, GD.getDtorType(), - Thunk.This, Name); + Thunk.This, Out); else - getCXXABI().getMangleContext().mangleThunk(MD, Thunk, Name); - + getCXXABI().getMangleContext().mangleThunk(MD, Thunk, Out); + Out.flush(); + const llvm::Type *Ty = getTypes().GetFunctionTypeForVTable(GD); return GetOrCreateLLVMFunction(Name, Ty, GD, /*ForVTable=*/true); } @@ -2975,7 +2977,9 @@ CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD, llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTable(const CXXRecordDecl *RD) { llvm::SmallString<256> OutName; - CGM.getCXXABI().getMangleContext().mangleCXXVTable(RD, OutName); + llvm::raw_svector_ostream Out(OutName); + CGM.getCXXABI().getMangleContext().mangleCXXVTable(RD, Out); + Out.flush(); llvm::StringRef Name = OutName.str(); ComputeVTableRelatedInformation(RD, true); @@ -3038,8 +3042,10 @@ CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD, // Get the mangled construction vtable name. llvm::SmallString<256> OutName; + llvm::raw_svector_ostream Out(OutName); CGM.getCXXABI().getMangleContext(). - mangleCXXCtorVTable(RD, Base.getBaseOffset() / 8, Base.getBase(), OutName); + mangleCXXCtorVTable(RD, Base.getBaseOffset() / 8, Base.getBase(), Out); + Out.flush(); llvm::StringRef Name = OutName.str(); const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); diff --git a/lib/CodeGen/CodeGenTBAA.cpp b/lib/CodeGen/CodeGenTBAA.cpp index b231e9e140..3f2c6cabf2 100644 --- a/lib/CodeGen/CodeGenTBAA.cpp +++ b/lib/CodeGen/CodeGenTBAA.cpp @@ -169,7 +169,9 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) { // TODO: This is using the RTTI name. Is there a better way to get // a unique string for a type? llvm::SmallString<256> OutName; - MContext.mangleCXXRTTIName(QualType(ETy, 0), OutName); + llvm::raw_svector_ostream Out(OutName); + MContext.mangleCXXRTTIName(QualType(ETy, 0), Out); + Out.flush(); return MetadataCache[Ty] = getTBAAInfoForNamedType(OutName, getChar()); } diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index 2068c2925c..95654a33a1 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -1072,7 +1072,9 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF, // Create the guard variable. llvm::SmallString<256> GuardVName; - getMangleContext().mangleItaniumGuardVariable(&D, GuardVName); + llvm::raw_svector_ostream Out(GuardVName); + getMangleContext().mangleItaniumGuardVariable(&D, Out); + Out.flush(); // Just absorb linkage and visibility from the variable. llvm::GlobalVariable *GuardVariable =