Avoid unnecessary string construction during asm printing.
[oota-llvm.git] / lib / CodeGen / MachineModuleInfo.cpp
index 1720745e4459fede06d5fbbd7a370ad2b9e71419..5c826b5ffc1a86e594af2e724d2b8a51a854bee6 100644 (file)
@@ -52,10 +52,9 @@ getGlobalVariablesUsing(Value *V, std::vector<GlobalVariable*> &Result) {
 
 /// getGlobalVariablesUsing - Return all of the GlobalVariables that use the
 /// named GlobalVariable.
-static std::vector<GlobalVariable*>
-getGlobalVariablesUsing(Module &M, const std::string &RootName) {
-  std::vector<GlobalVariable*> Result;  // GlobalVariables matching criteria.
-  
+static void
+getGlobalVariablesUsing(Module &M, const std::string &RootName,
+                        std::vector<GlobalVariable*> &Result) {
   std::vector<const Type*> FieldTypes;
   FieldTypes.push_back(Type::Int32Ty);
   FieldTypes.push_back(Type::Int32Ty);
@@ -65,11 +64,8 @@ getGlobalVariablesUsing(Module &M, const std::string &RootName) {
                                                 StructType::get(FieldTypes));
 
   // If present and linkonce then scan for users.
-  if (UseRoot && UseRoot->hasLinkOnceLinkage()) {
+  if (UseRoot && UseRoot->hasLinkOnceLinkage())
     getGlobalVariablesUsing(UseRoot, Result);
-  }
-  
-  return Result;
 }
   
 /// isStringValue - Return true if the given value can be coerced to a string.
@@ -201,10 +197,7 @@ private:
 
 public:
   DIDeserializeVisitor(DIDeserializer &D, GlobalVariable *GV)
-  : DIVisitor()
-  , DR(D)
-  , I(0)
-  , CI(cast<ConstantStruct>(GV->getInitializer()))
+    : DIVisitor(), DR(D), I(0), CI(cast<ConstantStruct>(GV->getInitializer()))
   {}
   
   /// Apply - Set the value of each of the fields.
@@ -231,11 +224,9 @@ public:
   }
   virtual void Apply(std::string &Field) {
     Constant *C = CI->getOperand(I++);
-    std::string S;
-    if (GetConstantStringInfo(C, S))
-      Field = S;
-    else
-      Field = "";
+    // Fills in the string if it succeeds
+    if (!GetConstantStringInfo(C, Field))
+      Field.clear();
   }
   virtual void Apply(DebugInfoDesc *&Field) {
     Constant *C = CI->getOperand(I++);
@@ -299,7 +290,7 @@ public:
     Elements.push_back(ConstantInt::get(Type::Int1Ty, Field));
   }
   virtual void Apply(std::string &Field) {
-      Elements.push_back(SR.getString(Field));
+    Elements.push_back(SR.getString(Field));
   }
   virtual void Apply(DebugInfoDesc *&Field) {
     GlobalVariable *GV = NULL;
@@ -1291,14 +1282,13 @@ const PointerType *DISerializer::getStrPtrType() {
 ///
 const PointerType *DISerializer::getEmptyStructPtrType() {
   // If not already defined.
-  if (!EmptyStructPtrTy) {
-    // Construct the empty structure type.
-    const StructType *EmptyStructTy =
-                                    StructType::get(std::vector<const Type*>());
-    // Construct the pointer to empty structure type.
-    EmptyStructPtrTy = PointerType::getUnqual(EmptyStructTy);
-  }
-  
+  if (EmptyStructPtrTy) return EmptyStructPtrTy;
+
+  // Construct the pointer to empty structure type.
+  const StructType *EmptyStructTy = StructType::get(NULL, NULL);
+
+  // Construct the pointer to empty structure type.
+  EmptyStructPtrTy = PointerType::getUnqual(EmptyStructTy);
   return EmptyStructPtrTy;
 }
 
@@ -1331,22 +1321,27 @@ const StructType *DISerializer::getTagType(DebugInfoDesc *DD) {
 Constant *DISerializer::getString(const std::string &String) {
   // Check string cache for previous edition.
   Constant *&Slot = StringCache[String];
+
   // Return Constant if previously defined.
   if (Slot) return Slot;
+
   // If empty string then use a sbyte* null instead.
   if (String.empty()) {
     Slot = ConstantPointerNull::get(getStrPtrType());
   } else {
     // Construct string as an llvm constant.
     Constant *ConstStr = ConstantArray::get(String);
+
     // Otherwise create and return a new string global.
     GlobalVariable *StrGV = new GlobalVariable(ConstStr->getType(), true,
                                                GlobalVariable::InternalLinkage,
                                                ConstStr, ".str", M);
     StrGV->setSection("llvm.metadata");
+
     // Convert to generic string pointer.
     Slot = ConstantExpr::getBitCast(StrGV, getStrPtrType());
   }
+
   return Slot;
   
 }
@@ -1376,7 +1371,7 @@ GlobalVariable *DISerializer::Serialize(DebugInfoDesc *DD) {
   // Add fields.
   DISerializeVisitor SRAM(*this, Elements);
   SRAM.ApplyToFields(DD);
-  
+
   // Set the globals initializer.
   GV->setInitializer(ConstantStruct::get(Ty, Elements));
   
@@ -1593,7 +1588,8 @@ void MachineModuleInfo::AnalyzeModule(Module &M) {
 /// SetupCompileUnits - Set up the unique vector of compile units.
 ///
 void MachineModuleInfo::SetupCompileUnits(Module &M) {
-  std::vector<CompileUnitDesc *>CU = getAnchoredDescriptors<CompileUnitDesc>(M);
+  std::vector<CompileUnitDesc *> CU;
+  getAnchoredDescriptors<CompileUnitDesc>(M, CU);
   
   for (unsigned i = 0, N = CU.size(); i < N; i++) {
     CompileUnits.insert(CU[i]);
@@ -1608,10 +1604,11 @@ const UniqueVector<CompileUnitDesc *> MachineModuleInfo::getCompileUnits()const{
 
 /// getGlobalVariablesUsing - Return all of the GlobalVariables that use the
 /// named GlobalVariable.
-std::vector<GlobalVariable*>
+void
 MachineModuleInfo::getGlobalVariablesUsing(Module &M,
-                                           const std::string &RootName) {
-  return ::getGlobalVariablesUsing(M, RootName);
+                                           const std::string &RootName,
+                                           std::vector<GlobalVariable*>&Result){
+  return ::getGlobalVariablesUsing(M, RootName, Result);
 }
 
 /// RecordSourceLine - Records location information and associates it with a
@@ -1756,7 +1753,7 @@ void MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad,
 void MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad,
                                         std::vector<GlobalVariable *> &TyInfo) {
   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
-  std::vector<unsigned> IdsInFilter (TyInfo.size());
+  std::vector<unsigned> IdsInFilter(TyInfo.size());
   for (unsigned I = 0, E = TyInfo.size(); I != E; ++I)
     IdsInFilter[I] = getTypeIDFor(TyInfo[I]);
   LP.TypeIds.push_back(getFilterIDFor(IdsInFilter));