[llvm-commits] [poolalloc] r124997 - /poolalloc/trunk/lib/DSA/StdLibPass.cpp
Arushi Aggarwal
aggarwa4 at illinois.edu
Sun Feb 6 17:25:17 PST 2011
Author: aggarwa4
Date: Sun Feb 6 19:25:17 2011
New Revision: 124997
URL: http://llvm.org/viewvc/llvm-project?rev=124997&view=rev
Log:
1. Add a few more functions
2. Changed the format for specifying function
behavior, allowing merging only certain parameters
with the return value. THis helps in certain
string functions.
Modified:
poolalloc/trunk/lib/DSA/StdLibPass.cpp
Modified: poolalloc/trunk/lib/DSA/StdLibPass.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/StdLibPass.cpp?rev=124997&r1=124996&r2=124997&view=diff
==============================================================================
--- poolalloc/trunk/lib/DSA/StdLibPass.cpp (original)
+++ poolalloc/trunk/lib/DSA/StdLibPass.cpp Sun Feb 6 19:25:17 2011
@@ -60,11 +60,8 @@
// The return value/arguments that should be marked as heap.
bool heap[numOps];
- // Flags whether all arguments should be merged together.
- bool mergeAllArgs;
-
// Flags whether the return value should be merged with all arguments.
- bool mergeWithRet;
+ bool mergeNodes[numOps];
// Flags whether the return value and arguments should be folded.
bool collapse;
@@ -84,106 +81,107 @@
const char* name;
libAction action;
} recFuncs[] = {
- {"stat", {NRET_YNARGS, NRET_NYARGS, NRET_NARGS, false, false, false}},
- {"fstat", {NRET_YNARGS, NRET_NYARGS, NRET_NARGS, false, false, false}},
- {"lstat", {NRET_YNARGS, NRET_NYARGS, NRET_NARGS, false, false, false}},
+ {"stat", {NRET_YNARGS, NRET_NYARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fstat", {NRET_YNARGS, NRET_NYARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"lstat", {NRET_YNARGS, NRET_NYARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"read", {NRET_YARGS, YRET_YARGS, NRET_NARGS, NRET_NARGS, false}},
// printf not strictly true, %n could cause a write
- {"printf", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"fprintf", {NRET_YARGS, NRET_YNARGS, NRET_NARGS, false, false, false}},
- {"sprintf", {NRET_YARGS, NRET_YNARGS, NRET_NARGS, false, false, false}},
- {"snprintf", {NRET_YARGS, NRET_YNARGS, NRET_NARGS, false, false, false}},
- {"puts", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"putc", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"putchar", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"fputs", {NRET_YARGS, NRET_NYARGS, NRET_NARGS, false, false, false}},
- {"fputc", {NRET_YARGS, NRET_NYARGS, NRET_NARGS, false, false, false}},
-
-
- {"calloc", {NRET_NARGS, YRET_NARGS, YRET_NARGS, false, false, false}},
- {"malloc", {NRET_NARGS, YRET_NARGS, YRET_NARGS, false, false, false}},
- {"valloc", {NRET_NARGS, YRET_NARGS, YRET_NARGS, false, false, false}},
- {"memalign", {NRET_NARGS, YRET_NARGS, YRET_NARGS, false, false, false}},
- {"realloc", {NRET_NARGS, YRET_NARGS, YRET_YNARGS, false, true, true}},
- {"free", {NRET_NARGS, NRET_NARGS, NRET_YNARGS, false, false, false}},
+ {"printf", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fprintf", {NRET_YARGS, NRET_YNARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sprintf", {NRET_YARGS, NRET_YNARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"snprintf", {NRET_YARGS, NRET_YNARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"puts", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"putc", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"putchar", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fputs", {NRET_YARGS, NRET_NYARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fputc", {NRET_YARGS, NRET_NYARGS, NRET_NARGS, NRET_NARGS, false}},
+
+
+ {"calloc", {NRET_NARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
+ {"malloc", {NRET_NARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
+ {"valloc", {NRET_NARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
+ {"realloc", {NRET_NARGS, YRET_NARGS, YRET_YNARGS, YRET_YNARGS,false}},
+ {"memalign", {NRET_NARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
+ {"posix_memalign", {NRET_YARGS, YRET_YNARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"free", {NRET_NARGS, NRET_NARGS, NRET_YNARGS, NRET_NARGS, false}},
- {"strdup", {NRET_YARGS, YRET_NARGS, YRET_NARGS, false, true, false}},
- {"wcsdup", {NRET_YARGS, YRET_NARGS, YRET_NARGS, false, true, false}},
+ {"strdup", {NRET_YARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
+ {"wcsdup", {NRET_YARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
- {"atoi", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"atof", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"atol", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"atoll", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"atoq", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
-
- {"memcmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"strcmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"wcscmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"strncmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"wcsncmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"strcasecmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"wcscasecmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"strncasecmp",{NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"wcsncasecmp",{NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"strlen", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"wcslen", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
-
- {"memchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"wmemchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"memrchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"strchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"wcschr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"strrchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"wcsrchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"strchrhul", {YRET_YARGS, NRET_NARGS, NRET_NARGS, false, true, true}},
- {"strcat", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
- {"strncat", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
-
- {"strcpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
- {"memccpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
- {"wmemccpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
- {"wcscpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
- {"strncpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
- {"wcsncpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, true, true, true}},
-
-
- {"fwrite", {NRET_YARGS, NRET_NYARGS, NRET_NARGS, false, false, false}},
- {"fread", {NRET_NYARGS, NRET_YARGS, NRET_NARGS, false, false, false}},
- {"fflush", {NRET_YARGS, NRET_YARGS, NRET_NARGS, false, false, false}},
- {"fclose", {NRET_YARGS, NRET_YARGS, NRET_NARGS, false, false, false}},
- {"fopen", {NRET_YARGS, YRET_NARGS, YRET_NARGS, false, false, false}},
- {"fileno", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"unlink", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
+ {"atoi", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"atof", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"atol", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"atoll", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"atoq", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+
+ {"memcmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"strcmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"wcscmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"strncmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"wcsncmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"strcasecmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"wcscasecmp", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"strncasecmp",{NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"wcsncasecmp",{NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"strlen", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"wcslen", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+
+ {"memchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"wmemchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"memrchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"strchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"wcschr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"strrchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"wcsrchr", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"strchrhul", {YRET_YARGS, NRET_NARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"strcat", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"strncat", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+
+ {"strcpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"strncpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"memccpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"memcpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"memmove", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"wmemccpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"wcscpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+ {"wcsncpy", {YRET_YARGS, YRET_YARGS, NRET_NARGS, YRET_YNARGS, true}},
+
+ {"fwrite", {NRET_YARGS, NRET_NYARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"write", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fread", {NRET_NYARGS, NRET_YARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fflush", {NRET_YARGS, NRET_YARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fclose", {NRET_YARGS, NRET_YARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fopen", {NRET_YARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
+ {"open", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"fileno", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"unlink", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
- {"perror", {NRET_YARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
+ {"perror", {NRET_YARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
// SAFECode Intrinsics
- {"sc.lscheck", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.lscheckui", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.lscheckalign", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.lscheckalignui", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.pool_register_stack", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.pool_unregister_stack", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.pool_register_global", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.pool_unregister_global", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.pool_register", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.pool_unregister", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
- {"sc.pool_argvregister", {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
+ {"sc.lscheck", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.lscheckui", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.lscheckalign", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.lscheckalignui", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.pool_register_stack", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.pool_unregister_stack", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.pool_register_global", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.pool_unregister_global", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.pool_register", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.pool_unregister", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
+ {"sc.pool_argvregister", {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
#if 0
{"remove", {false, false, false, true, false, false, false, false, false}},
{"unlink", {false, false, false, true, false, false, false, false, false}},
{"rename", {false, false, false, true, false, false, false, false, false}},
- {"memcmp", {false, false, false, true, false, false, false, false, false}},
{"execl", {false, false, false, true, false, false, false, false, false}},
{"execlp", {false, false, false, true, false, false, false, false, false}},
{"execle", {false, false, false, true, false, false, false, false, false}},
{"execv", {false, false, false, true, false, false, false, false, false}},
{"execvp", {false, false, false, true, false, false, false, false, false}},
{"chmod", {false, false, false, true, false, false, false, false, false}},
- {"puts", {false, false, false, true, false, false, false, false, false}},
- {"write", {false, false, false, true, false, false, false, false, false}},
- {"open", {false, false, false, true, false, false, false, false, false}},
{"create", {false, false, false, true, false, false, false, false, false}},
{"truncate", {false, false, false, true, false, false, false, false, false}},
{"chdir", {false, false, false, true, false, false, false, false, false}},
@@ -194,21 +192,21 @@
{"wait", {false, false, false, false, true, false, false, false, false}},
{"time", {false, false, false, false, true, false, false, false, false}},
{"getrusage", {false, false, false, false, true, false, false, false, false}},
- {"memmove", {false, true, false, true, true, false, true, true, true}},
{"bcopy", {false, false, false, true, true, false, true, false, true}},
{"getcwd", { true, true, true, true, true, true, false, true, true}},
#endif
+
// C++ functions, as mangled on linux gcc 4.2
// operator new(unsigned long)
- {"_Znwm", {NRET_NARGS, YRET_NARGS, YRET_NARGS, false, false, false}},
+ {"_Znwm", {NRET_NARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
// operator new[](unsigned long)
- {"_Znam", {NRET_NARGS, YRET_NARGS, YRET_NARGS, false, false, false}},
+ {"_Znam", {NRET_NARGS, YRET_NARGS, YRET_NARGS, NRET_NARGS, false}},
// operator delete(void*)
- {"_ZdlPv", {NRET_NARGS, NRET_NARGS, NRET_YNARGS, false, false, false}},
+ {"_ZdlPv", {NRET_NARGS, NRET_NARGS, NRET_YNARGS,NRET_NARGS, false}},
// operator delete[](void*)
- {"_ZdaPv", {NRET_NARGS, NRET_NARGS, NRET_YNARGS, false, false, false}},
+ {"_ZdaPv", {NRET_NARGS, NRET_NARGS, NRET_YNARGS, NRET_NARGS, false}},
// Terminate the list of special functions recognized by this pass
- {0, {NRET_NARGS, NRET_NARGS, NRET_NARGS, false, false, false}},
+ {0, {NRET_NARGS, NRET_NARGS, NRET_NARGS, NRET_NARGS, false}},
};
//
@@ -316,6 +314,7 @@
if (!I->isDeclaration())
getOrCreateGraph(&*I);
+ //FIXME: Should this happen in a "StdLib" Pass???
//
// Erase direct calls to functions that don't return a pointer and are marked
// with the readnone annotation.
@@ -393,12 +392,12 @@
// appropriate.
//
std::vector<DSNodeHandle> toMerge;
- if (recFuncs[x].action.mergeWithRet)
+ if (recFuncs[x].action.mergeNodes[0])
if (isa<PointerType>(CI->getType()))
if (Graph->hasNodeForValue(CI))
toMerge.push_back(Graph->getNodeForValue(CI));
- if (recFuncs[x].action.mergeAllArgs || recFuncs[x].action.mergeWithRet)
for (unsigned y = 1; y < CI->getNumOperands(); ++y)
+ if (recFuncs[x].action.mergeNodes[y])
if (isa<PointerType>(CI->getOperand(y)->getType()))
if (Graph->hasNodeForValue(CI->getOperand(y)))
toMerge.push_back(Graph->getNodeForValue(CI->getOperand(y)));
@@ -469,12 +468,12 @@
// appropriate.
//
std::vector<DSNodeHandle> toMerge;
- if (recFuncs[x].action.mergeWithRet)
+ if (recFuncs[x].action.mergeNodes[0])
if (isa<PointerType>(CI->getType()))
if (Graph->hasNodeForValue(CI))
toMerge.push_back(Graph->getNodeForValue(CI));
- if (recFuncs[x].action.mergeAllArgs || recFuncs[x].action.mergeWithRet)
for (unsigned y = 1; y < CI->getNumOperands(); ++y)
+ if (recFuncs[x].action.mergeNodes[y])
if (isa<PointerType>(CI->getOperand(y)->getType()))
if (Graph->hasNodeForValue(CI->getOperand(y)))
toMerge.push_back(Graph->getNodeForValue(CI->getOperand(y)));
More information about the llvm-commits
mailing list