From eab779203160c36f9bf7b668324d5dbb886bd20e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 6 Oct 2007 06:29:41 +0000 Subject: [PATCH] speed up clang startup time by about 23% by avoiding lots of stringmap operations when there are no secondary targets. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42688 91177308-0d34-0410-b5e6-96231b3b80d8 --- Basic/TargetInfo.cpp | 50 +++++++++++++++++++-------------- clang.xcodeproj/project.pbxproj | 1 - 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Basic/TargetInfo.cpp b/Basic/TargetInfo.cpp index 2c476b8627..afa4285aaa 100644 --- a/Basic/TargetInfo.cpp +++ b/Basic/TargetInfo.cpp @@ -88,6 +88,35 @@ static void GetTargetDefineMap(const TargetInfoImpl *Target, /// getTargetDefines - Appends the target-specific #define values for this /// target set to the specified buffer. void TargetInfo::getTargetDefines(std::vector &Buffer) { + // If we have no secondary targets, be a bit more efficient. + if (SecondaryTargets.empty()) { + std::vector PrimaryDefines; + PrimaryTarget->getTargetDefines(PrimaryDefines); + + for (unsigned i = 0, e = PrimaryDefines.size(); i != e; ++i) { + // Always produce a #define. + const char *Command = "#define "; + Buffer.insert(Buffer.end(), Command, Command+strlen("#define ")); + + const std::string &Val = PrimaryDefines[i]; + unsigned EqualPos = Val.find('='); + if (EqualPos != std::string::npos) { + // Insert "defname defvalue\n". + Buffer.insert(Buffer.end(), Val.begin(), Val.begin()+EqualPos); + Buffer.push_back(' '); + Buffer.insert(Buffer.end(), Val.begin()+EqualPos+1, Val.end()); + Buffer.push_back('\n'); + } else { + // Insert "defname 1\n". + Buffer.insert(Buffer.end(), Val.begin(), Val.end()); + Buffer.push_back(' '); + Buffer.push_back('1'); + Buffer.push_back('\n'); + } + } + return; + } + // This is tricky in the face of secondary targets. Specifically, // target-specific #defines that are present and identical across all // secondary targets are turned into #defines, #defines that are present in @@ -101,27 +130,6 @@ void TargetInfo::getTargetDefines(std::vector &Buffer) { llvm::StringMap PrimaryDefines; GetTargetDefineMap(PrimaryTarget, PrimaryDefines); - // If we have no secondary targets, be a bit more efficient. - if (SecondaryTargets.empty()) { - for (llvm::StringMap::iterator I = - PrimaryDefines.begin(), E = PrimaryDefines.end(); I != E; ++I) { - // If this define is non-portable, turn it into #define_target, otherwise - // just use #define. - const char *Command = "#define "; - Buffer.insert(Buffer.end(), Command, Command+strlen(Command)); - - // Insert "defname defvalue\n". - const char *KeyStart = I->getKeyData(); - const char *KeyEnd = KeyStart + I->getKeyLength(); - - Buffer.insert(Buffer.end(), KeyStart, KeyEnd); - Buffer.push_back(' '); - Buffer.insert(Buffer.end(), I->getValue().begin(), I->getValue().end()); - Buffer.push_back('\n'); - } - return; - } - // Get the sets of secondary #defines. llvm::StringMap *SecondaryDefines = new llvm::StringMap[SecondaryTargets.size()]; diff --git a/clang.xcodeproj/project.pbxproj b/clang.xcodeproj/project.pbxproj index 3e20445759..22a3173a06 100644 --- a/clang.xcodeproj/project.pbxproj +++ b/clang.xcodeproj/project.pbxproj @@ -739,7 +739,6 @@ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */; - compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; mainGroup = 08FB7794FE84155DC02AAC07 /* clang */; projectDirPath = ""; -- 2.40.0