[llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp

Chris Lattner lattner at cs.uiuc.edu
Fri May 20 15:22:36 PDT 2005



Changes in directory llvm/lib/Transforms/IPO:

SimplifyLibCalls.cpp updated: 1.37 -> 1.38
---
Log message:

Fix mismatched type problem that crashed on cases like this:

  sprintf(P, "%s", X);

Where X is not an sbyte*.  This fixes the bug JohnMC reported on llvm-bugs.



---
Diffs of the changes:  (+17 -8)

 SimplifyLibCalls.cpp |   25 +++++++++++++++++--------
 1 files changed, 17 insertions(+), 8 deletions(-)


Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp
diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.37 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.38
--- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.37	Sun May 15 16:27:34 2005
+++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp	Fri May 20 17:22:25 2005
@@ -542,7 +542,7 @@
     return false;
   }
 
-  /// @brief Perform the strcpy optimization
+  /// @brief Perform the strchr optimizations
   virtual bool OptimizeCall(CallInst* ci, SimplifyLibCalls& SLC)
   {
     // If there aren't three operands, bail
@@ -625,7 +625,7 @@
       "Number of 'strcmp' calls simplified") {}
   virtual ~StrCmpOptimization() {}
 
-  /// @brief Make sure that the "strcpy" function has the right prototype
+  /// @brief Make sure that the "strcmp" function has the right prototype
   virtual bool ValidateCalledFunction(const Function* f, SimplifyLibCalls& SLC) 
   {
     if (f->getReturnType() == Type::IntTy && f->arg_size() == 2)
@@ -633,7 +633,7 @@
     return false;
   }
 
-  /// @brief Perform the strcpy optimization
+  /// @brief Perform the strcmp optimization
   virtual bool OptimizeCall(CallInst* ci, SimplifyLibCalls& SLC)
   {
     // First, check to see if src and destination are the same. If they are,
@@ -710,7 +710,7 @@
       "Number of 'strncmp' calls simplified") {}
   virtual ~StrNCmpOptimization() {}
 
-  /// @brief Make sure that the "strcpy" function has the right prototype
+  /// @brief Make sure that the "strncmp" function has the right prototype
   virtual bool ValidateCalledFunction(const Function* f, SimplifyLibCalls& SLC) 
   {
     if (f->getReturnType() == Type::IntTy && f->arg_size() == 3)
@@ -1366,6 +1366,15 @@
   }
 } FPrintFOptimizer;
 
+/// CastToCStr - Return V if it is an sbyte*, otherwise cast it to sbyte*,
+/// inserting the cast before IP, and return the cast.
+static Value *CastToCStr(Value *V, Instruction &IP) {
+  const Type *SBPTy = PointerType::get(Type::SByteTy);
+  if (V->getType() != SBPTy)
+    return new CastInst(V, SBPTy, V->getName(), &IP);
+  return V;
+}
+
 
 /// This LibCallOptimization will simplify calls to the "sprintf" library 
 /// function. It looks for cases where the result of sprintf is not used and the
@@ -1468,8 +1477,8 @@
           if (!strcpy_func)
             return false;
           std::vector<Value*> args;
-          args.push_back(ci->getOperand(1));
-          args.push_back(ci->getOperand(3));
+          args.push_back(CastToCStr(ci->getOperand(1), *ci));
+          args.push_back(CastToCStr(ci->getOperand(3), *ci));
           new CallInst(strcpy_func,args,"",ci);
         }
         else if (getConstantStringLength(ci->getOperand(3),len))
@@ -1480,8 +1489,8 @@
           if (!memcpy_func)
             return false;
           std::vector<Value*> args;
-          args.push_back(ci->getOperand(1));
-          args.push_back(ci->getOperand(3));
+          args.push_back(CastToCStr(ci->getOperand(1), *ci));
+          args.push_back(CastToCStr(ci->getOperand(3), *ci));
           args.push_back(ConstantUInt::get(Type::UIntTy,len));
           args.push_back(ConstantUInt::get(Type::UIntTy,1));
           new CallInst(memcpy_func,args,"",ci);






More information about the llvm-commits mailing list