From 6719dde6f3b5a94712a143da016ee5e214dc5f60 Mon Sep 17 00:00:00 2001 From: Alp Toker Date: Sat, 7 Jun 2014 23:30:53 +0000 Subject: Avoid dubious IdentifierInfo::getNameStart() uses These cases in particular were incurring an extra strlen() when we already knew the length. They appear to be leftovers from when the interfaces worked with C strings that have continued to compile due to the implicit StringRef ctor. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210403 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclObjC.h | 4 +--- lib/CodeGen/CGObjCMac.cpp | 56 +++++++++++++++++++------------------------ lib/Index/USRGeneration.cpp | 2 +- lib/Sema/SemaPseudoObject.cpp | 6 ++--- lib/Sema/SemaStmtAttr.cpp | 2 +- tools/libclang/CXString.cpp | 6 ++++- 6 files changed, 34 insertions(+), 42 deletions(-) diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 4ca02d2388..44d85b53b5 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -1947,9 +1947,7 @@ public: // // FIXME: This is a bad API, we are overriding the NamedDecl::getName, to mean // something different. - StringRef getName() const { - return Id ? Id->getNameStart() : ""; - } + StringRef getName() const { return Id ? Id->getName() : StringRef(); } /// @brief Get the name of the class associated with this interface. // diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 95503cc7ef..1d2b7a7e46 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -1018,14 +1018,12 @@ protected: /// \param Name - The variable name. /// \param Init - The variable initializer; this is also used to /// define the type of the variable. - /// \param Section - The section the variable should go into, or 0. + /// \param Section - The section the variable should go into, or empty. /// \param Align - The alignment for the variable, or 0. /// \param AddToUsed - Whether the variable should be added to /// "llvm.used". - llvm::GlobalVariable *CreateMetadataVar(Twine Name, - llvm::Constant *Init, - const char *Section, - unsigned Align, + llvm::GlobalVariable *CreateMetadataVar(Twine Name, llvm::Constant *Init, + StringRef Section, unsigned Align, bool AddToUsed); CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF, @@ -2723,9 +2721,8 @@ CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD, llvm::ConstantStruct::get(ObjCTypes.ProtocolExtensionTy, Values); // No special section, but goes in llvm.used - return CreateMetadataVar("\01l_OBJC_PROTOCOLEXT_" + PD->getName(), - Init, - nullptr, 0, true); + return CreateMetadataVar("\01l_OBJC_PROTOCOLEXT_" + PD->getName(), Init, + StringRef(), 0, true); } /* @@ -2858,11 +2855,9 @@ CGObjCCommonMac::EmitProtocolMethodTypes(Twine Name, MethodTypes.size()); llvm::Constant *Init = llvm::ConstantArray::get(AT, MethodTypes); - llvm::GlobalVariable *GV = - CreateMetadataVar(Name, Init, - (ObjCABI == 2) ? "__DATA, __objc_const" : nullptr, - (ObjCABI == 2) ? 8 : 4, - true); + llvm::GlobalVariable *GV = CreateMetadataVar( + Name, Init, (ObjCABI == 2) ? "__DATA, __objc_const" : StringRef(), + (ObjCABI == 2) ? 8 : 4, true); return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.Int8PtrPtrTy); } @@ -3395,18 +3390,17 @@ llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD, return Method; } -llvm::GlobalVariable * -CGObjCCommonMac::CreateMetadataVar(Twine Name, - llvm::Constant *Init, - const char *Section, - unsigned Align, - bool AddToUsed) { +llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name, + llvm::Constant *Init, + StringRef Section, + unsigned Align, + bool AddToUsed) { llvm::Type *Ty = Init->getType(); llvm::GlobalVariable *GV = new llvm::GlobalVariable(CGM.getModule(), Ty, false, llvm::GlobalValue::PrivateLinkage, Init, Name); assertPrivateName(GV); - if (Section) + if (!Section.empty()) GV->setSection(Section); if (Align) GV->setAlignment(Align); @@ -4457,13 +4451,12 @@ llvm::Constant *CGObjCCommonMac::GetClassName(IdentifierInfo *Ident) { llvm::GlobalVariable *&Entry = ClassNames[Ident]; if (!Entry) - Entry = CreateMetadataVar("\01L_OBJC_CLASS_NAME_", - llvm::ConstantDataArray::getString(VMContext, - Ident->getNameStart()), - ((ObjCABI == 2) ? - "__TEXT,__objc_classname,cstring_literals" : - "__TEXT,__cstring,cstring_literals"), - 1, true); + Entry = CreateMetadataVar( + "\01L_OBJC_CLASS_NAME_", + llvm::ConstantDataArray::getString(VMContext, Ident->getName()), + ((ObjCABI == 2) ? "__TEXT,__objc_classname,cstring_literals" + : "__TEXT,__cstring,cstring_literals"), + 1, true); return getConstantGEP(VMContext, Entry, 0, 0); } @@ -4926,11 +4919,10 @@ llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) { llvm::GlobalVariable *&Entry = PropertyNames[Ident]; if (!Entry) - Entry = CreateMetadataVar("\01L_OBJC_PROP_NAME_ATTR_", - llvm::ConstantDataArray::getString(VMContext, - Ident->getNameStart()), - "__TEXT,__cstring,cstring_literals", - 1, true); + Entry = CreateMetadataVar( + "\01L_OBJC_PROP_NAME_ATTR_", + llvm::ConstantDataArray::getString(VMContext, Ident->getName()), + "__TEXT,__cstring,cstring_literals", 1, true); return getConstantGEP(VMContext, Entry, 0, 0); } diff --git a/lib/Index/USRGeneration.cpp b/lib/Index/USRGeneration.cpp index 7554bc65b2..c7740be282 100644 --- a/lib/Index/USRGeneration.cpp +++ b/lib/Index/USRGeneration.cpp @@ -824,7 +824,7 @@ bool clang::index::generateUSRForMacro(const MacroDefinition *MD, if (ShouldGenerateLocation) printLoc(Out, Loc, SM, /*IncludeOffset=*/true); Out << "@macro@"; - Out << MD->getName()->getNameStart(); + Out << MD->getName()->getName(); return false; } diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index 19cb12c73b..eaed1e47e9 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -569,13 +569,11 @@ bool ObjCPropertyOpBuilder::findGetter() { assert(setter && "both setter and getter are null - cannot happen"); IdentifierInfo *setterName = setter->getSelector().getIdentifierInfoForSlot(0); - const char *compStr = setterName->getNameStart(); - compStr += 3; - IdentifierInfo *getterName = &S.Context.Idents.get(compStr); + IdentifierInfo *getterName = + &S.Context.Idents.get(setterName->getName().substr(3)); GetterSelector = S.PP.getSelectorTable().getNullarySelector(getterName); return false; - } } diff --git a/lib/Sema/SemaStmtAttr.cpp b/lib/Sema/SemaStmtAttr.cpp index 1ec42ef0af..87d055bb49 100644 --- a/lib/Sema/SemaStmtAttr.cpp +++ b/lib/Sema/SemaStmtAttr.cpp @@ -62,7 +62,7 @@ static Attr *handleLoopHintAttr(Sema &S, Stmt *St, const AttributeList &A, assert(OptionInfo && "Attribute must have valid option info."); LoopHintAttr::OptionType Option = - llvm::StringSwitch(OptionInfo->getNameStart()) + llvm::StringSwitch(OptionInfo->getName()) .Case("vectorize", LoopHintAttr::Vectorize) .Case("vectorize_width", LoopHintAttr::VectorizeWidth) .Case("interleave", LoopHintAttr::Interleave) diff --git a/tools/libclang/CXString.cpp b/tools/libclang/CXString.cpp index 1523034dbd..662b0f94db 100644 --- a/tools/libclang/CXString.cpp +++ b/tools/libclang/CXString.cpp @@ -81,7 +81,11 @@ CXString createDup(const char *String) { CXString createRef(StringRef String) { // If the string is not nul-terminated, we have to make a copy. - // This is doing a one past end read, and should be removed! + + // FIXME: This is doing a one past end read, and should be removed! For memory + // we don't manage, the API string can become unterminated at any time outside + // our control. + if (!String.empty() && String.data()[String.size()] != 0) return createDup(String); -- cgit v1.2.3