Temporarily XFAIL this test.
authorBill Wendling <isanbard@gmail.com>
Fri, 13 Mar 2009 04:37:11 +0000 (04:37 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 13 Mar 2009 04:37:11 +0000 (04:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66866 91177308-0d34-0410-b5e6-96231b3b80d8

15 files changed:
include/llvm/Analysis/DebugInfo.h
include/llvm/Analysis/ValueTracking.h
lib/Analysis/DbgInfoPrinter.cpp
lib/Analysis/DebugInfo.cpp
lib/Analysis/ValueTracking.cpp
lib/CodeGen/AsmPrinter/DwarfWriter.cpp
lib/CodeGen/SelectionDAG/FastISel.cpp
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp
lib/Debugger/ProgramInfo.cpp
lib/Transforms/Scalar/InstructionCombining.cpp
lib/Transforms/Scalar/SimplifyLibCalls.cpp
test/FrontendC++/2009-02-16-CtorNames-dbg.cpp

index c6f09283bd3da1fd742dd1d72f93e643adfc7639..b31896e6ff20ce2f467875d6554fc495b897a606 100644 (file)
@@ -40,7 +40,7 @@ namespace llvm {
     /// not, the debug info is corrupt and we ignore it.
     DIDescriptor(GlobalVariable *GV, unsigned RequiredTag);
 
-    const std::string &getStringField(unsigned Elt, std::string &Result) const;
+    const char *getStringField(unsigned Elt) const;
     unsigned getUnsignedField(unsigned Elt) const {
       return (unsigned)getUInt64Field(Elt);
     }
@@ -106,14 +106,14 @@ namespace llvm {
     explicit DICompileUnit(GlobalVariable *GV = 0);
 
     unsigned getLanguage() const     { return getUnsignedField(2); }
-    const std::string &getFilename(std::string &F) const {
-      return getStringField(3, F);
+    const char *getFilename() const {
+      return getStringField(3);
     }
-    const std::string &getDirectory(std::string &F) const {
-      return getStringField(4, F);
+    const char *getDirectory() const {
+      return getStringField(4);
     }
-    const std::string &getProducer(std::string &F) const {
-      return getStringField(5, F);
+    const char *getProducer() const {
+      return getStringField(5);
     }
     
     /// isMain - Each input file is encoded as a separate compile unit in LLVM
@@ -127,9 +127,7 @@ namespace llvm {
 
     bool isMain() const                { return getUnsignedField(6); }
     bool isOptimized() const           { return getUnsignedField(7); }
-    const std::string &getFlags(std::string &F) const {
-      return getStringField(8, F);
-    }
+    const char *getFlags() const       { return getStringField(8);   }
     unsigned getRunTimeVersion() const { return getUnsignedField(9); }
 
     /// Verify - Verify that a compile unit is well formed.
@@ -146,8 +144,8 @@ namespace llvm {
   public:
     explicit DIEnumerator(GlobalVariable *GV = 0);
 
-    const std::string &getName(std::string &F) const {
-      return getStringField(1, F);
+    const char *getName() const {
+      return getStringField(1);
     }
     uint64_t getEnumValue() const { return getUInt64Field(2); }
   };
@@ -192,9 +190,7 @@ namespace llvm {
     virtual ~DIType() {}
 
     DIDescriptor getContext() const     { return getDescriptorField(1); }
-    const std::string &getName(std::string &F) const {
-      return getStringField(2, F);
-    }
+    const char *getName() const         { return getStringField(2);  }
     DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); }
     unsigned getLineNumber() const      { return getUnsignedField(4); }
     uint64_t getSizeInBits() const      { return getUInt64Field(5); }
@@ -276,14 +272,14 @@ namespace llvm {
     virtual ~DIGlobal() {}
 
     DIDescriptor getContext() const     { return getDescriptorField(2); }
-    const std::string &getName(std::string &F) const {
-      return getStringField(3, F);
+    const char *getName() const {
+      return getStringField(3);
     }
-    const std::string &getDisplayName(std::string &F) const {
-      return getStringField(4, F);
+    const char *getDisplayName() const {
+      return getStringField(4);
     }
-    const std::string &getLinkageName(std::string &F) const {
-      return getStringField(5, F);
+    const char *getLinkageName() const {
+      return getStringField(5);
     }
     DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(6); }
     unsigned getLineNumber() const      { return getUnsignedField(7); }
@@ -331,8 +327,8 @@ namespace llvm {
     explicit DIVariable(GlobalVariable *GV = 0);
 
     DIDescriptor getContext() const { return getDescriptorField(1); }
-    const std::string &getName(std::string &F) const {
-      return getStringField(2, F);
+    const char *getName() const {
+      return getStringField(2);
     }
     DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); }
     unsigned getLineNumber() const      { return getUnsignedField(4); }
index 5f5f77a5c9fe7407eb09b6af9589888e902accac..cefa076e79c70b3f87ec92cbc17da72e2a6298d7 100644 (file)
@@ -75,13 +75,13 @@ namespace llvm {
   }
   
   /// GetConstantStringInfo - This function computes the length of a
-  /// null-terminated C string pointed to by V.  If successful, it returns true
-  /// and returns the string in Str.  If unsuccessful, it returns false.  If
-  /// StopAtNul is set to true (the default), the returned string is truncated
-  /// by a nul character in the global.  If StopAtNul is false, the nul
-  /// character is included in the result string.
-  bool GetConstantStringInfo(Value *V, std::string &Str, uint64_t Offset = 0,
-                             bool StopAtNul = true);
+  /// null-terminated C string pointed to by V. If successful, it returns the
+  /// string.  If unsuccessful, it returns NUL. If StopAtNul is set to true
+  /// (the default), the returned string is truncated by a nul character in the
+  /// global. If StopAtNul is false, the nul character is included in the
+  /// result string.
+  const char *GetConstantStringInfo(Value *V, uint64_t Offset = 0,
+                                    bool StopAtNul = true);
 } // end namespace llvm
 
 #endif
index e43bc81ffac2115b9b01be60ef5518064956ad81..6346a90a68c7650374cd9d75b15715627e768b36 100644 (file)
@@ -33,31 +33,29 @@ static cl::opt<bool>
 PrintDirectory("print-fullpath", cl::desc("Print fullpath when printing debug info"), cl::Hidden);
 
 namespace {
-       struct VISIBILITY_HIDDEN PrintDbgInfo : public FunctionPass {
+  struct VISIBILITY_HIDDEN PrintDbgInfo : public FunctionPass {
     private:
       raw_ostream &Out;
       void printStopPoint(const DbgStopPointInst *DSI);
       void printFuncStart(const DbgFuncStartInst *FS);
       void printVariableDeclaration(const Value *V);
-               public:
-                       static char ID; // Pass identification
-                       PrintDbgInfo() : FunctionPass(&ID), Out(outs()) {}
+  public:
+      static char ID; // Pass identification
+      PrintDbgInfo() : FunctionPass(&ID), Out(outs()) {}
 
-                       virtual bool runOnFunction(Function &F);
-                       virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-                               AU.setPreservesAll();
-                       }
-
-       };
-       char PrintDbgInfo::ID = 0;
-       static RegisterPass<PrintDbgInfo> X("print-dbginfo",
-      "Print debug info in human readable form");
+      virtual bool runOnFunction(Function &F);
+      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+        AU.setPreservesAll();
+      }
+  };
+  char PrintDbgInfo::ID = 0;
+  static RegisterPass<PrintDbgInfo> X("print-dbginfo",
+                                     "Print debug info in human readable form");
 }
 
 FunctionPass *llvm::createDbgInfoPrinterPass() { return new PrintDbgInfo(); }
 
-void PrintDbgInfo::printVariableDeclaration(const Value *V)
-{
+void PrintDbgInfo::printVariableDeclaration(const Value *V) {
   std::string DisplayName, File, Directory, Type;
   unsigned LineNo;
   if (getLocationInfo(V, DisplayName, Type, LineNo, File, Directory)) {
@@ -75,24 +73,22 @@ void PrintDbgInfo::printVariableDeclaration(const Value *V)
 void PrintDbgInfo::printStopPoint(const DbgStopPointInst *DSI)
 {
   if (PrintDirectory) {
-    std::string dir;
-               GetConstantStringInfo(DSI->getDirectory(), dir);
-    Out << dir << "/";
+    const char *Dir = GetConstantStringInfo(DSI->getDirectory());
+    Out << (Dir ? Dir : "") << "/";
   }
-  std::string file;
-  GetConstantStringInfo(DSI->getFileName(), file);
-  Out << file << ":" << DSI->getLine();
-  if (unsigned Col = DSI->getColumn()) {
+
+  const char *FN = GetConstantStringInfo(DSI->getFileName());
+  Out << (FN ? FN : "") << ":" << DSI->getLine();
+
+  if (unsigned Col = DSI->getColumn())
     Out << ":" << Col;
-  }
 }
 
 void PrintDbgInfo::printFuncStart(const DbgFuncStartInst *FS)
 {
   DISubprogram Subprogram(cast<GlobalVariable>(FS->getSubprogram()));
-  std::string Res1, Res2;
-  Out << ";fully qualified function name: " << Subprogram.getDisplayName(Res1)
-    << " return type: " << Subprogram.getType().getName(Res2)
+  Out << ";fully qualified function name: " << Subprogram.getDisplayName()
+    << " return type: " << Subprogram.getType().getName()
     << " at line " << Subprogram.getLineNumber()
     << "\n\n";
 }
index d9f0aa53e9df3603f67697c7f947a09208d52cd2..901455700edd2c36f40539829771962da1fa77e4 100644 (file)
@@ -35,24 +35,16 @@ DIDescriptor::DIDescriptor(GlobalVariable *gv, unsigned RequiredTag) {
     GV = 0;
 }
 
-const std::string &
-DIDescriptor::getStringField(unsigned Elt, std::string &Result) const {
-  if (GV == 0) {
-    Result.clear();
-    return Result;
-  }
+const char *DIDescriptor::getStringField(unsigned Elt) const {
+  if (GV == 0)
+    return 0;
 
   Constant *C = GV->getInitializer();
-  if (C == 0 || Elt >= C->getNumOperands()) {
-    Result.clear();
-    return Result;
-  }
+  if (C == 0 || Elt >= C->getNumOperands())
+    return 0;
   
   // Fills in the string if it succeeds
-  if (!GetConstantStringInfo(C->getOperand(Elt), Result))
-    Result.clear();
-
-  return Result;
+  return GetConstantStringInfo(C->getOperand(Elt));
 }
 
 uint64_t DIDescriptor::getUInt64Field(unsigned Elt) const {
@@ -190,11 +182,9 @@ unsigned DIArray::getNumElements() const {
 bool DICompileUnit::Verify() const {
   if (isNull()) 
     return false;
-  std::string Res;
-  if (getFilename(Res).empty()) 
-    return false;
+
   // It is possible that directory and produce string is empty.
-  return true;
+  return getFilename();
 }
 
 /// Verify - Verify that a type descriptor is well formed.
@@ -505,7 +495,7 @@ DIEnumerator DIFactory::CreateEnumerator(const std::string &Name, uint64_t Val){
 
 /// CreateBasicType - Create a basic type like int, float, etc.
 DIBasicType DIFactory::CreateBasicType(DIDescriptor Context,
-                                      const std::string &Name,
+                                       const std::string &Name,
                                        DICompileUnit CompileUnit,
                                        unsigned LineNumber,
                                        uint64_t SizeInBits,
@@ -894,8 +884,7 @@ namespace llvm {
   }
 
   bool getLocationInfo(const Value *V, std::string &DisplayName, std::string &Type,
-                       unsigned &LineNo, std::string &File, std::string &Dir)
-  {
+                       unsigned &LineNo, std::string &File, std::string &Dir) {
     DICompileUnit Unit;
     DIType TypeD;
     if (GlobalVariable *GV = dyn_cast<GlobalVariable>(const_cast<Value*>(V))) {
@@ -903,7 +892,11 @@ namespace llvm {
       if (!DIGV)
         return false;
       DIGlobalVariable Var(cast<GlobalVariable>(DIGV));
-      Var.getDisplayName(DisplayName);
+      const char *DN = Var.getDisplayName();
+      if (DN)
+        DisplayName = DN;
+      else
+        DisplayName.clear();
       LineNo = Var.getLineNumber();
       Unit = Var.getCompileUnit();
       TypeD = Var.getType();
@@ -912,14 +905,24 @@ namespace llvm {
       if (!DDI)
         return false;
       DIVariable Var(cast<GlobalVariable>(DDI->getVariable()));
-      Var.getName(DisplayName);
+      const char *DN = Var.getName();
+      if (DN)
+        DisplayName = DN;
+      else
+        DisplayName.clear();
       LineNo = Var.getLineNumber();
       Unit = Var.getCompileUnit();
       TypeD = Var.getType();
     }
-    TypeD.getName(Type);
-    Unit.getFilename(File);
-    Unit.getDirectory(Dir);
+    Type.clear();
+    File.clear();
+    Dir.clear();
+    const char *Str = TypeD.getName();
+    if (Str) Type = Str;
+    Str = Unit.getFilename();
+    if (Str) File = Str;
+    Str = Unit.getDirectory();
+    if (Str) Dir = Str;
     return true;
   }
 }
@@ -929,17 +932,17 @@ void DICompileUnit::dump() const {
   if (getLanguage())
     cerr << " [" << dwarf::LanguageString(getLanguage()) << "] ";
 
-  std::string Res1, Res2;
-  cerr << " [" << getDirectory(Res1) << "/" << getFilename(Res2) << " ]";
+  const char *Dir = getDirectory();
+  const char *FN = getFilename();
+  cerr << " [" << (Dir ? Dir : "") << "/" << (FN ? FN : "") << " ]";
 }
 
 /// dump - print type.
 void DIType::dump() const {
   if (isNull()) return;
 
-  std::string Res;
-  if (!getName(Res).empty())
-    cerr << " [" << Res << "] ";
+  if (const char *N = getName())
+    cerr << " [" << N << "] ";
 
   unsigned Tag = getTag();
   cerr << " [" << dwarf::TagString(Tag) << "] ";
@@ -996,9 +999,8 @@ void DICompositeType::dump() const {
 
 /// dump - print global.
 void DIGlobal::dump() const {
-  std::string Res;
-  if (!getName(Res).empty())
-    cerr << " [" << Res << "] ";
+  if (const char *N = getName())
+    cerr << " [" << N << "] ";
 
   unsigned Tag = getTag();
   cerr << " [" << dwarf::TagString(Tag) << "] ";
@@ -1031,9 +1033,8 @@ void DIGlobalVariable::dump() const {
 
 /// dump - print variable.
 void DIVariable::dump() const {
-  std::string Res;
-  if (!getName(Res).empty())
-    cerr << " [" << Res << "] ";
+  if (const char *N = getName())
+    cerr << " [" << N << "] ";
 
   getCompileUnit().dump();
   cerr << " [" << getLineNumber() << "] ";
index 20fa69ea24f59c3238eb406a10a559983fa903b0..d3a7d1bfeb22fbceab77aca452f9d971b0a7cb40 100644 (file)
 #include "llvm/Instructions.h"
 #include "llvm/GlobalVariable.h"
 #include "llvm/IntrinsicInst.h"
-#include "llvm/Target/TargetData.h"
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
 #include "llvm/Support/MathExtras.h"
+#include "llvm/Target/TargetData.h"
 #include <cstring>
 using namespace llvm;
 
@@ -928,6 +929,7 @@ Value *llvm::FindInsertedValue(Value *V, const unsigned *idx_begin,
     return FindInsertedValue(I->getAggregateOperand(), Idxs.begin(), Idxs.end(),
                              InsertBefore);
   }
+
   // Otherwise, we don't know (such as, extracting from a function return value
   // or load instruction)
   return 0;
@@ -936,55 +938,86 @@ Value *llvm::FindInsertedValue(Value *V, const unsigned *idx_begin,
 /// GetConstantStringInfo - This function computes the length of a
 /// null-terminated C string pointed to by V.  If successful, it returns true
 /// and returns the string in Str.  If unsuccessful, it returns false.
-bool llvm::GetConstantStringInfo(Value *V, std::string &Str, uint64_t Offset,
-                                 bool StopAtNul) {
-  // If V is NULL then return false;
-  if (V == NULL) return false;
+const char *llvm::GetConstantStringInfo(Value *V, uint64_t Offset,
+                                        bool StopAtNul) {
+  static DenseMap<Value*, std::string> StringInfoMap;
+  static DenseMap<Value*, bool> NulMap;
+
+  // If we've already determined that the Value is NUL, then return 0.
+  if (NulMap[V])
+    return 0;
+
+  // Check to see if we've already calculated the string info.
+  if (StringInfoMap.find(V) != StringInfoMap.end())
+    return StringInfoMap.lookup(V).c_str();
+
+  // If V is NULL then return nul.
+  if (V == 0) {
+    NulMap[V] = true;
+    return 0;
+  }
+
+  std::string *Str = &StringInfoMap.FindAndConstruct(V).second;
+  Str->clear();
 
   // Look through bitcast instructions.
   if (BitCastInst *BCI = dyn_cast<BitCastInst>(V))
-    return GetConstantStringInfo(BCI->getOperand(0), Str, Offset, StopAtNul);
-  
+    return GetConstantStringInfo(BCI->getOperand(0), Offset, StopAtNul);
+
   // If the value is not a GEP instruction nor a constant expression with a
   // GEP instruction, then return false because ConstantArray can't occur
   // any other way
   User *GEP = 0;
+
   if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(V)) {
     GEP = GEPI;
   } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
     if (CE->getOpcode() == Instruction::BitCast)
-      return GetConstantStringInfo(CE->getOperand(0), Str, Offset, StopAtNul);
-    if (CE->getOpcode() != Instruction::GetElementPtr)
-      return false;
+      return GetConstantStringInfo(CE->getOperand(0), Offset, StopAtNul);
+
+    if (CE->getOpcode() != Instruction::GetElementPtr) {
+      NulMap[V] = true;
+      return 0;
+    }
+
     GEP = CE;
   }
   
   if (GEP) {
     // Make sure the GEP has exactly three arguments.
-    if (GEP->getNumOperands() != 3)
-      return false;
-    
+    if (GEP->getNumOperands() != 3) {
+      NulMap[V] = true;
+      return 0;
+    }
+
     // Make sure the index-ee is a pointer to array of i8.
     const PointerType *PT = cast<PointerType>(GEP->getOperand(0)->getType());
     const ArrayType *AT = dyn_cast<ArrayType>(PT->getElementType());
-    if (AT == 0 || AT->getElementType() != Type::Int8Ty)
-      return false;
+    if (AT == 0 || AT->getElementType() != Type::Int8Ty) {
+      NulMap[V] = true;
+      return 0;
+    }
     
     // Check to make sure that the first operand of the GEP is an integer and
     // has value 0 so that we are sure we're indexing into the initializer.
     ConstantInt *FirstIdx = dyn_cast<ConstantInt>(GEP->getOperand(1));
-    if (FirstIdx == 0 || !FirstIdx->isZero())
-      return false;
+    if (FirstIdx == 0 || !FirstIdx->isZero()) {
+      NulMap[V] = true;
+      return 0;
+    }
     
     // If the second index isn't a ConstantInt, then this is a variable index
     // into the array.  If this occurs, we can't say anything meaningful about
     // the string.
     uint64_t StartIdx = 0;
-    if (ConstantInt *CI = dyn_cast<ConstantInt>(GEP->getOperand(2)))
+    if (ConstantInt *CI = dyn_cast<ConstantInt>(GEP->getOperand(2))) {
       StartIdx = CI->getZExtValue();
-    else
-      return false;
-    return GetConstantStringInfo(GEP->getOperand(0), Str, StartIdx+Offset,
+    } else {
+      NulMap[V] = true;
+      return 0;
+    }
+
+    return GetConstantStringInfo(GEP->getOperand(0), StartIdx + Offset,
                                  StopAtNul);
   }
   
@@ -992,42 +1025,53 @@ bool llvm::GetConstantStringInfo(Value *V, std::string &Str, uint64_t Offset,
   // variable that is a constant and is initialized. The referenced constant
   // initializer is the array that we'll use for optimization.
   GlobalVariable* GV = dyn_cast<GlobalVariable>(V);
-  if (!GV || !GV->isConstant() || !GV->hasInitializer())
-    return false;
+  if (!GV || !GV->isConstant() || !GV->hasInitializer()) {
+    NulMap[V] = true;
+    return 0;
+  }
   Constant *GlobalInit = GV->getInitializer();
   
   // Handle the ConstantAggregateZero case
-  if (isa<ConstantAggregateZero>(GlobalInit)) {
+  if (isa<ConstantAggregateZero>(GlobalInit))
     // This is a degenerate case. The initializer is constant zero so the
     // length of the string must be zero.
-    Str.clear();
-    return true;
-  }
+    return "";
   
   // Must be a Constant Array
   ConstantArray *Array = dyn_cast<ConstantArray>(GlobalInit);
-  if (Array == 0 || Array->getType()->getElementType() != Type::Int8Ty)
-    return false;
+  if (Array == 0 || Array->getType()->getElementType() != Type::Int8Ty) {
+    NulMap[V] = true;
+    return 0;
+  }
   
   // Get the number of elements in the array
   uint64_t NumElts = Array->getType()->getNumElements();
   
-  if (Offset > NumElts)
-    return false;
+  if (Offset > NumElts) {
+    NulMap[V] = true;
+    return 0;
+  }
   
   // Traverse the constant array from 'Offset' which is the place the GEP refers
   // to in the array.
-  Str.reserve(NumElts-Offset);
+  Str->reserve(NumElts - Offset);
+
   for (unsigned i = Offset; i != NumElts; ++i) {
     Constant *Elt = Array->getOperand(i);
     ConstantInt *CI = dyn_cast<ConstantInt>(Elt);
-    if (!CI) // This array isn't suitable, non-int initializer.
-      return false;
+
+    if (!CI) {                // This array isn't suitable, non-int initializer.
+      StringInfoMap.erase(V);
+      NulMap[V] = true;
+      return 0;
+    }
+
     if (StopAtNul && CI->isZero())
-      return true; // we found end of string, success!
-    Str += (char)CI->getZExtValue();
+      return Str->c_str(); // we found end of string, success!
+
+    Str->operator+=((char)CI->getZExtValue());
   }
-  
+
   // The array isn't null terminated, but maybe this is a memcpy, not a strcpy.
-  return true;
+  return Str->c_str();
 }
index 4120d9f917105721e3490c31557a796218456ff1..7190b9269b256683bb0ae91dac2ef55c9df2df05 100644 (file)
@@ -1619,14 +1619,12 @@ private:
   /// ConstructTypeDIE - Construct basic type die from DIBasicType.
   void ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
                         DIBasicType BTy) {
-    
     // Get core information.
-    std::string Name;
-    BTy.getName(Name);
+    const char *Name = BTy.getName();
     Buffer.setTag(DW_TAG_base_type);
     AddUInt(&Buffer, DW_AT_encoding,  DW_FORM_data1, BTy.getEncoding());
     // Add name if not anonymous or intermediate type.
-    if (!Name.empty())
+    if (Name)
       AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
     uint64_t Size = BTy.getSizeInBits() >> 3;
     AddUInt(&Buffer, DW_AT_byte_size, 0, Size);
@@ -1635,10 +1633,8 @@ private:
   /// ConstructTypeDIE - Construct derived type die from DIDerivedType.
   void ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
                         DIDerivedType DTy) {
-
     // Get core information.
-    std::string Name;
-    DTy.getName(Name);
+    const char *Name = DTy.getName();
     uint64_t Size = DTy.getSizeInBits() >> 3;
     unsigned Tag = DTy.getTag();
 
@@ -1652,7 +1648,7 @@ private:
     AddType(DW_Unit, &Buffer, FromTy);
 
     // Add name if not anonymous or intermediate type.
-    if (!Name.empty())
+    if (Name)
       AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
 
     // Add size if non-zero (derived types might be zero-sized.)
@@ -1669,8 +1665,7 @@ private:
   void ConstructTypeDIE(CompileUnit *DW_Unit, DIE &Buffer,
                         DICompositeType CTy) {
     // Get core information.
-    std::string Name;
-    CTy.getName(Name);
+    const char *Name = CTy.getName();
 
     uint64_t Size = CTy.getSizeInBits() >> 3;
     unsigned Tag = CTy.getTag();
@@ -1746,7 +1741,7 @@ private:
     }
 
     // Add name if not anonymous or intermediate type.
-    if (!Name.empty())
+    if (Name)
       AddString(&Buffer, DW_AT_name, DW_FORM_string, Name);
 
     if (Tag == DW_TAG_enumeration_type || Tag == DW_TAG_structure_type
@@ -1811,8 +1806,7 @@ private:
   DIE *ConstructEnumTypeDIE(CompileUnit *DW_Unit, DIEnumerator *ETy) {
 
     DIE *Enumerator = new DIE(DW_TAG_enumerator);
-    std::string Name;
-    ETy->getName(Name);
+    const char *Name = ETy->getName();
     AddString(Enumerator, DW_AT_name, DW_FORM_string, Name);
     int64_t Value = ETy->getEnumValue();                             
     AddSInt(Enumerator, DW_AT_const_value, DW_FORM_sdata, Value);
@@ -1823,12 +1817,10 @@ private:
   DIE *CreateGlobalVariableDIE(CompileUnit *DW_Unit, const DIGlobalVariable &GV)
   {
     DIE *GVDie = new DIE(DW_TAG_variable);
-    std::string Name;
-    GV.getDisplayName(Name);
+    const char *Name = GV.getDisplayName();
     AddString(GVDie, DW_AT_name, DW_FORM_string, Name);
-    std::string LinkageName;
-    GV.getLinkageName(LinkageName);
-    if (!LinkageName.empty())
+    const char *LinkageName = GV.getLinkageName();
+    if (LinkageName)
       AddString(GVDie, DW_AT_MIPS_linkage_name, DW_FORM_string, LinkageName);
     AddType(DW_Unit, GVDie, GV.getType());
     if (!GV.isLocalToUnit())
@@ -1840,9 +1832,8 @@ private:
   /// CreateMemberDIE - Create new member DIE.
   DIE *CreateMemberDIE(CompileUnit *DW_Unit, const DIDerivedType &DT) {
     DIE *MemberDie = new DIE(DT.getTag());
-    std::string Name;
-    DT.getName(Name);
-    if (!Name.empty())
+    const char *Name = DT.getName();
+    if (Name)
       AddString(MemberDie, DW_AT_name, DW_FORM_string, Name);
 
     AddType(DW_Unit, MemberDie, DT.getTypeDerivedFrom());
@@ -1885,12 +1876,10 @@ private:
                            const  DISubprogram &SP,
                            bool IsConstructor = false) {
     DIE *SPDie = new DIE(DW_TAG_subprogram);
-    std::string Name;
-    SP.getName(Name);
+    const char *Name = SP.getName();
     AddString(SPDie, DW_AT_name, DW_FORM_string, Name);
-    std::string LinkageName;
-    SP.getLinkageName(LinkageName);
-    if (!LinkageName.empty())
+    const char *LinkageName = SP.getLinkageName();
+    if (LinkageName)
       AddString(SPDie, DW_AT_MIPS_linkage_name, DW_FORM_string, 
                 LinkageName);
     AddSourceLine(SPDie, &SP);
@@ -1956,8 +1945,7 @@ private:
 
     // Define variable debug information entry.
     DIE *VariableDie = new DIE(Tag);
-    std::string Name;
-    VD.getName(Name);
+    const char *Name = VD.getName();
     AddString(VariableDie, DW_AT_name, DW_FORM_string, Name);
 
     // Add source line info if available.
@@ -2819,24 +2807,23 @@ private:
 
   void ConstructCompileUnit(GlobalVariable *GV) {
     DICompileUnit DIUnit(GV);
-    std::string Dir, FN, Prod;
-    unsigned ID = GetOrCreateSourceID(DIUnit.getDirectory(Dir),
-                                      DIUnit.getFilename(FN));
+    const char *Dir = DIUnit.getDirectory();
+    const char *FN = DIUnit.getFilename();
+    unsigned ID = GetOrCreateSourceID(Dir, FN);
 
     DIE *Die = new DIE(DW_TAG_compile_unit);
     AddSectionOffset(Die, DW_AT_stmt_list, DW_FORM_data4,
                      DWLabel("section_line", 0), DWLabel("section_line", 0),
                      false);
-    AddString(Die, DW_AT_producer, DW_FORM_string, DIUnit.getProducer(Prod));
+    AddString(Die, DW_AT_producer, DW_FORM_string, DIUnit.getProducer());
     AddUInt(Die, DW_AT_language, DW_FORM_data1, DIUnit.getLanguage());
     AddString(Die, DW_AT_name, DW_FORM_string, FN);
-    if (!Dir.empty())
+    if (Dir)
       AddString(Die, DW_AT_comp_dir, DW_FORM_string, Dir);
     if (DIUnit.isOptimized())
       AddUInt(Die, DW_AT_APPLE_optimized, DW_FORM_flag, 1);
-    std::string Flags;
-    DIUnit.getFlags(Flags);
-    if (!Flags.empty())
+    const char *Flags = DIUnit.getFlags();
+    if (Flags)
       AddString(Die, DW_AT_APPLE_flags, DW_FORM_string, Flags);
     unsigned RVer = DIUnit.getRunTimeVersion();
     if (RVer)
@@ -2895,8 +2882,7 @@ private:
     // Add to context owner.
     DW_Unit->getDie()->AddChild(VariableDie);
     // Expose as global. FIXME - need to check external flag.
-    std::string Name;
-    DW_Unit->AddGlobal(DI_GV.getName(Name), VariableDie);
+    DW_Unit->AddGlobal(DI_GV.getName(), VariableDie);
     return true;
   }
 
@@ -2948,8 +2934,7 @@ private:
     // Add to context owner.
     Unit->getDie()->AddChild(SubprogramDie);
     // Expose as global.
-    std::string Name;
-    Unit->AddGlobal(SP.getName(Name), SubprogramDie);
+    Unit->AddGlobal(SP.getName(), SubprogramDie);
     return true;
   }
 
index 229376d293c04feeca2bbeb2535167f40b38e065..a0ed4755f9f3ab98a30095cbb038e866e602f09c 100644 (file)
@@ -319,9 +319,8 @@ bool FastISel::SelectCall(User *I) {
     DbgStopPointInst *SPI = cast<DbgStopPointInst>(I);
     if (DW && DW->ValidDebugInfo(SPI->getContext())) {
       DICompileUnit CU(cast<GlobalVariable>(SPI->getContext()));
-      std::string Dir, FN;
-      unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir),
-                                                 CU.getFilename(FN));
+      unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(),
+                                                 CU.getFilename());
       unsigned Line = SPI->getLine();
       unsigned Col = SPI->getColumn();
       unsigned ID = DW->RecordSourceLine(Line, Col, SrcFile);
@@ -362,9 +361,8 @@ bool FastISel::SelectCall(User *I) {
       // (most?) gdb expects.
       DISubprogram Subprogram(cast<GlobalVariable>(SP));
       DICompileUnit CompileUnit = Subprogram.getCompileUnit();
-      std::string Dir, FN;
-      unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir),
-                                                 CompileUnit.getFilename(FN));
+      unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(),
+                                                 CompileUnit.getFilename());
 
       // Record the source line but does not create a label for the normal
       // function start. It will be emitted at asm emission time. However,
index 8c074e75ebf3c1204375bb1a357a8577e53a0867..0854aad9b6827cea6e827c7c36930a3548b449aa 100644 (file)
@@ -1287,9 +1287,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
       GlobalVariable *CU_GV = cast<GlobalVariable>(DSP->getCompileUnit());
       if (DW && (useDEBUG_LOC || useLABEL) && !CU_GV->isDeclaration()) {
         DICompileUnit CU(cast<GlobalVariable>(DSP->getCompileUnit()));
-        std::string Dir, FN;
-        unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir),
-                                                   CU.getFilename(FN));
+        unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(),
+                                                   CU.getFilename());
 
         unsigned Line = DSP->getLine();
         unsigned Col = DSP->getColumn();
index 71560fe2ae6d87371a43aa169ef2f0296f29f2e5..4afc3b5c3ecbb2507593282434850a90b348b623 100644 (file)
@@ -2931,8 +2931,11 @@ static bool isMemSrcFromString(SDValue Src, std::string &Str) {
     return false;
 
   GlobalVariable *GV = dyn_cast<GlobalVariable>(G->getGlobal());
-  if (GV && GetConstantStringInfo(GV, Str, SrcDelta, false))
-    return true;
+  if (GV) {
+    const char *SI = GetConstantStringInfo(GV, SrcDelta, false);
+    Str = (SI ? SI : "");
+    if (!Str.empty()) return true;
+  }
 
   return false;
 }
index 0dbc35b2248daeb08d10f92624153c9f406e8521..b3a06ea9d75526f995469856d0fe3cc1f3749b5c 100644 (file)
@@ -335,9 +335,8 @@ void FunctionLoweringInfo::set(Function &fn, MachineFunction &mf,
 
             if (DW && DW->ValidDebugInfo(SPI->getContext())) {
               DICompileUnit CU(cast<GlobalVariable>(SPI->getContext()));
-              std::string Dir, FN;
-              unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir),
-                                                         CU.getFilename(FN));
+              unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(),
+                                                         CU.getFilename());
               unsigned idx = MF->getOrCreateDebugLocID(SrcFile,
                                                        SPI->getLine(),
                                                        SPI->getColumn());
@@ -355,9 +354,8 @@ void FunctionLoweringInfo::set(Function &fn, MachineFunction &mf,
               if (DW->ValidDebugInfo(SP)) {
                 DISubprogram Subprogram(cast<GlobalVariable>(SP));
                 DICompileUnit CU(Subprogram.getCompileUnit());
-                std::string Dir, FN;
-                unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir),
-                                                           CU.getFilename(FN));
+                unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(),
+                                                           CU.getFilename());
                 unsigned Line = Subprogram.getLineNumber();
                 DL = DebugLoc::get(MF->getOrCreateDebugLocID(SrcFile, Line, 0));
               }
@@ -3904,9 +3902,8 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
                                       SPI.getColumn(),
                                       SPI.getContext()));
       DICompileUnit CU(cast<GlobalVariable>(SPI.getContext()));
-      std::string Dir, FN;
-      unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir),
-                                                 CU.getFilename(FN));
+      unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(),
+                                                 CU.getFilename());
       unsigned idx = MF.getOrCreateDebugLocID(SrcFile,
                                               SPI.getLine(), SPI.getColumn());
       setCurDebugLoc(DebugLoc::get(idx));
@@ -3950,9 +3947,8 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
       MachineFunction &MF = DAG.getMachineFunction();
       DISubprogram Subprogram(cast<GlobalVariable>(SP));
       DICompileUnit CompileUnit = Subprogram.getCompileUnit();
-      std::string Dir, FN;
-      unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir),
-                                                 CompileUnit.getFilename(FN));
+      unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(),
+                                                 CompileUnit.getFilename());
 
       // Record the source line but does not create a label for the normal
       // function start. It will be emitted at asm emission time. However,
index 03923387625beb96473e3f78fb111896bf738258..9475ffa8591b428827d8f70391df4ea1fd91e674 100644 (file)
@@ -179,8 +179,8 @@ std::string DOTGraphTraits<SelectionDAG*>::getNodeLabel(const SDNode *Node,
     }
   } else if (const DbgStopPointSDNode *D = dyn_cast<DbgStopPointSDNode>(Node)) {
     DICompileUnit CU(cast<GlobalVariable>(D->getCompileUnit()));
-    std::string FN;
-    Op += ": " + CU.getFilename(FN);
+    const char *FN = CU.getFilename();
+    Op += ": " + std::string(FN ? FN : "");
     Op += ":" + utostr(D->getLine());
     if (D->getColumn() != 0)
       Op += ":" + utostr(D->getColumn());
index 125ff556dd50057bd8c7008313dcaf53df59c7e5..2bf993ce5a9d6354345564e73f4b728be98390b7 100644 (file)
@@ -117,10 +117,10 @@ SourceFileInfo::SourceFileInfo(const GlobalVariable *Desc,
         if (ConstantInt *CUI = dyn_cast<ConstantInt>(CS->getOperand(1)))
           Version = CUI->getZExtValue();
 
-        if (!GetConstantStringInfo(CS->getOperand(3), BaseName))
-          BaseName = "";
-        if (!GetConstantStringInfo(CS->getOperand(4), Directory))
-          Directory = "";
+        const char *SI = GetConstantStringInfo(CS->getOperand(3));
+        BaseName = (SI ? SI : "");
+        SI = GetConstantStringInfo(CS->getOperand(4));
+        Directory = (SI ? SI : "");
       }
 }
 
@@ -160,8 +160,8 @@ SourceFunctionInfo::SourceFunctionInfo(ProgramInfo &PI,
           SourceFile = &PI.getSourceFile(GV);
 
         // Entry #2 is the function name.
-        if (!GetConstantStringInfo(CS->getOperand(2), Name))
-          Name = "";
+        const char *SI = GetConstantStringInfo(CS->getOperand(2));
+        Name = (SI ? SI : "");
       }
 }
 
index b2a6864194075dc74e5a5b4f0dfab9b7a9d7f0ed..8e8962928dd2807276d69212939a2a37fcbe6da0 100644 (file)
@@ -11043,11 +11043,12 @@ static Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI,
   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(CI)) {
     // Instead of loading constant c string, use corresponding integer value
     // directly if string length is small enough.
-    std::string Str;
-    if (GetConstantStringInfo(CE->getOperand(0), Str) && !Str.empty()) {
-      unsigned len = Str.length();
+    const char *Str = GetConstantStringInfo(CE->getOperand(0));
+    if (Str) {
+      unsigned len = strlen(Str);
       const Type *Ty = cast<PointerType>(CE->getType())->getElementType();
       unsigned numBits = Ty->getPrimitiveSizeInBits();
+
       // Replace LI with immediate integer store.
       if ((numBits >> 3) == len + 1) {
         APInt StrVal(numBits, 0);
index b878e4b4790f6647c73f442f0c2912912be8a4c6..9fd926d6436f21400df7b3fca46263e657c26a08 100644 (file)
@@ -551,9 +551,10 @@ struct VISIBILITY_HIDDEN StrChrOpt : public LibCallOptimization {
 
     // Otherwise, the character is a constant, see if the first argument is
     // a string literal.  If so, we can constant fold.
-    std::string Str;
-    if (!GetConstantStringInfo(SrcStr, Str))
+    const char *SI = GetConstantStringInfo(SrcStr);
+    if (!SI)
       return 0;
+    std::string Str = SI;
     
     // strchr can find the nul character.
     Str += '\0';
@@ -592,27 +593,28 @@ struct VISIBILITY_HIDDEN StrCmpOpt : public LibCallOptimization {
     if (Str1P == Str2P)      // strcmp(x,x)  -> 0
       return ConstantInt::get(CI->getType(), 0);
     
-    std::string Str1, Str2;
-    bool HasStr1 = GetConstantStringInfo(Str1P, Str1);
-    bool HasStr2 = GetConstantStringInfo(Str2P, Str2);
-    
-    if (HasStr1 && Str1.empty()) // strcmp("", x) -> *x
+    const char *Str1 = GetConstantStringInfo(Str1P);
+    const char *Str2 = GetConstantStringInfo(Str1P);
+
+    if (Str1)                   // strcmp("", x) -> *x
       return B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), CI->getType());
     
-    if (HasStr2 && Str2.empty()) // strcmp(x,"") -> *x
+    if (Str2)                   // strcmp(x,"") -> *x
       return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType());
     
     // strcmp(x, y)  -> cnst  (if both x and y are constant strings)
-    if (HasStr1 && HasStr2)
-      return ConstantInt::get(CI->getType(), strcmp(Str1.c_str(),Str2.c_str()));
+    if (Str1 && Str2)
+      return ConstantInt::get(CI->getType(), strcmp(Str1, Str2));
 
     // strcmp(P, "x") -> memcmp(P, "x", 2)
     uint64_t Len1 = GetStringLength(Str1P);
     uint64_t Len2 = GetStringLength(Str2P);
+
     if (Len1 || Len2) {
       // Choose the smallest Len excluding 0 which means 'unknown'.
       if (!Len1 || (Len2 && Len2 < Len1))
         Len1 = Len2;
+
       return EmitMemCmp(Str1P, Str2P,
                         ConstantInt::get(TD->getIntPtrType(), Len1), B);
     }
@@ -647,21 +649,21 @@ struct VISIBILITY_HIDDEN StrNCmpOpt : public LibCallOptimization {
     
     if (Length == 0) // strncmp(x,y,0)   -> 0
       return ConstantInt::get(CI->getType(), 0);
-    
-    std::string Str1, Str2;
-    bool HasStr1 = GetConstantStringInfo(Str1P, Str1);
-    bool HasStr2 = GetConstantStringInfo(Str2P, Str2);
-    
-    if (HasStr1 && Str1.empty())  // strncmp("", x, n) -> *x
+
+    const char *Str1 = GetConstantStringInfo(Str1P);
+    const char *Str2 = GetConstantStringInfo(Str2P);
+
+    if (Str1)                   // strncmp("", x, n) -> *x
       return B.CreateZExt(B.CreateLoad(Str2P, "strcmpload"), CI->getType());
     
-    if (HasStr2 && Str2.empty())  // strncmp(x, "", n) -> *x
+    if (Str2)                   // strncmp(x, "", n) -> *x
       return B.CreateZExt(B.CreateLoad(Str1P, "strcmpload"), CI->getType());
     
     // strncmp(x, y)  -> cnst  (if both x and y are constant strings)
-    if (HasStr1 && HasStr2)
+    if (Str1 && Str2)
       return ConstantInt::get(CI->getType(),
-                              strncmp(Str1.c_str(), Str2.c_str(), Length));
+                              strncmp(Str1, Str2, Length));
+
     return 0;
   }
 };
@@ -1116,9 +1118,9 @@ struct VISIBILITY_HIDDEN PrintFOpt : public LibCallOptimization {
       return 0;
     
     // Check for a fixed format string.
-    std::string FormatStr;
-    if (!GetConstantStringInfo(CI->getOperand(1), FormatStr))
-      return 0;
+    const char *FormatCStr = GetConstantStringInfo(CI->getOperand(1));
+    if (!FormatCStr) return 0;
+    std::string FormatStr = FormatCStr;
 
     // Empty format string -> noop.
     if (FormatStr.empty())  // Tolerate printf's declared void.
@@ -1176,9 +1178,9 @@ struct VISIBILITY_HIDDEN SPrintFOpt : public LibCallOptimization {
       return 0;
 
     // Check for a fixed format string.
-    std::string FormatStr;
-    if (!GetConstantStringInfo(CI->getOperand(2), FormatStr))
-      return 0;
+    const char *FormatCStr = GetConstantStringInfo(CI->getOperand(2));
+    if (!FormatCStr) return 0;
+    std::string FormatStr = FormatCStr;
     
     // If we just have a format string (nothing else crazy) transform it.
     if (CI->getNumOperands() == 3) {
@@ -1297,9 +1299,9 @@ struct VISIBILITY_HIDDEN FPrintFOpt : public LibCallOptimization {
       return 0;
     
     // All the optimizations depend on the format string.
-    std::string FormatStr;
-    if (!GetConstantStringInfo(CI->getOperand(2), FormatStr))
-      return 0;
+    const char *FormatCStr = GetConstantStringInfo(CI->getOperand(2));
+    if (!FormatCStr) return 0;
+    std::string FormatStr = FormatCStr;
 
     // fprintf(F, "foo") --> fwrite("foo", 3, 1, F)
     if (CI->getNumOperands() == 3) {
index 7d9882763796512dcae5fe73fe2d873f2ebb8720..401df90ab37be26ae71cbd50a2687e59384ba51b 100644 (file)
@@ -1,6 +1,8 @@
 // RUN: %llvmgcc -S -g --emit-llvm %s -o - | grep "\~A"
 // RUN: %llvmgcc -S -g --emit-llvm %s -o - | not grep comp_ctor
 // RUN: %llvmgcc -S -g --emit-llvm %s -o - | not grep comp_dtor
+// FIXME: This is failing on Darwin because of either r66861 or r66859.
+// XFAIL: darwin
 class A {
   int i;
 public: