Move some functions out of gccld.cpp to GenerateCode.cpp. This allows us

to reduce the inter-file interface in the gccld tool and gets some
uninteresting code out of gccld.cpp.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13942 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2004-06-02 00:22:24 +00:00
parent 7e88d418bb
commit 0ebee7410f
5 changed files with 90 additions and 114 deletions

View File

@ -332,8 +332,8 @@ bool llvm::LinkFiles(const char *progname, Module *HeadModule,
std::cerr << "Trying to link archive '" << Pathname << "'\n"; std::cerr << "Trying to link archive '" << Pathname << "'\n";
if (LinkInArchive(HeadModule, Pathname, ErrorMessage, Verbose)) { if (LinkInArchive(HeadModule, Pathname, ErrorMessage, Verbose)) {
PrintAndReturn(progname, ErrorMessage, std::cerr << progname << ": Error linking in archive '" << Pathname
": Error linking in archive '" + Pathname + "'"); << "': " << ErrorMessage << "\n";
return true; return true;
} }
} else if (IsBytecode(Pathname)) { } else if (IsBytecode(Pathname)) {
@ -341,8 +341,8 @@ bool llvm::LinkFiles(const char *progname, Module *HeadModule,
std::cerr << "Trying to link bytecode file '" << Pathname << "'\n"; std::cerr << "Trying to link bytecode file '" << Pathname << "'\n";
if (LinkInFile(HeadModule, Pathname, ErrorMessage, Verbose)) { if (LinkInFile(HeadModule, Pathname, ErrorMessage, Verbose)) {
PrintAndReturn(progname, ErrorMessage, std::cerr << progname << ": Error linking in bytecode file '"
": Error linking in bytecode file '" + Pathname + "'"); << Pathname << "': " << ErrorMessage << "\n";
return true; return true;
} }
} }

View File

@ -39,6 +39,84 @@ namespace {
cl::desc("Do not run any optimization passes")); cl::desc("Do not run any optimization passes"));
} }
/// CopyEnv - This function takes an array of environment variables and makes a
/// copy of it. This copy can then be manipulated any way the caller likes
/// without affecting the process's real environment.
///
/// Inputs:
/// envp - An array of C strings containing an environment.
///
/// Return value:
/// NULL - An error occurred.
///
/// Otherwise, a pointer to a new array of C strings is returned. Every string
/// in the array is a duplicate of the one in the original array (i.e. we do
/// not copy the char *'s from one array to another).
///
static char ** CopyEnv(char ** const envp) {
// Count the number of entries in the old list;
unsigned entries; // The number of entries in the old environment list
for (entries = 0; envp[entries] != NULL; entries++)
/*empty*/;
// Add one more entry for the NULL pointer that ends the list.
++entries;
// If there are no entries at all, just return NULL.
if (entries == 0)
return NULL;
// Allocate a new environment list.
char **newenv = new char* [entries];
if ((newenv = new char* [entries]) == NULL)
return NULL;
// Make a copy of the list. Don't forget the NULL that ends the list.
entries = 0;
while (envp[entries] != NULL) {
newenv[entries] = new char[strlen (envp[entries]) + 1];
strcpy (newenv[entries], envp[entries]);
++entries;
}
newenv[entries] = NULL;
return newenv;
}
/// RemoveEnv - Remove the specified environment variable from the environment
/// array.
///
/// Inputs:
/// name - The name of the variable to remove. It cannot be NULL.
/// envp - The array of environment variables. It cannot be NULL.
///
/// Notes:
/// This is mainly done because functions to remove items from the environment
/// are not available across all platforms. In particular, Solaris does not
/// seem to have an unsetenv() function or a setenv() function (or they are
/// undocumented if they do exist).
///
static void RemoveEnv(const char * name, char ** const envp) {
for (unsigned index=0; envp[index] != NULL; index++) {
// Find the first equals sign in the array and make it an EOS character.
char *p = strchr (envp[index], '=');
if (p == NULL)
continue;
else
*p = '\0';
// Compare the two strings. If they are equal, zap this string.
// Otherwise, restore it.
if (!strcmp(name, envp[index]))
*envp[index] = '\0';
else
*p = '=';
}
return;
}
static inline void addPass(PassManager &PM, Pass *P) { static inline void addPass(PassManager &PM, Pass *P) {
// Add the pass to the pass manager... // Add the pass to the pass manager...
PM.add(P); PM.add(P);
@ -270,3 +348,4 @@ int llvm::GenerateNative(const std::string &OutputFilename,
// Run the compiler to assembly and link together the program. // Run the compiler to assembly and link together the program.
return ExecWait(&(cmd[0]), clean_env); return ExecWait(&(cmd[0]), clean_env);
} }

View File

@ -332,8 +332,8 @@ bool llvm::LinkFiles(const char *progname, Module *HeadModule,
std::cerr << "Trying to link archive '" << Pathname << "'\n"; std::cerr << "Trying to link archive '" << Pathname << "'\n";
if (LinkInArchive(HeadModule, Pathname, ErrorMessage, Verbose)) { if (LinkInArchive(HeadModule, Pathname, ErrorMessage, Verbose)) {
PrintAndReturn(progname, ErrorMessage, std::cerr << progname << ": Error linking in archive '" << Pathname
": Error linking in archive '" + Pathname + "'"); << "': " << ErrorMessage << "\n";
return true; return true;
} }
} else if (IsBytecode(Pathname)) { } else if (IsBytecode(Pathname)) {
@ -341,8 +341,8 @@ bool llvm::LinkFiles(const char *progname, Module *HeadModule,
std::cerr << "Trying to link bytecode file '" << Pathname << "'\n"; std::cerr << "Trying to link bytecode file '" << Pathname << "'\n";
if (LinkInFile(HeadModule, Pathname, ErrorMessage, Verbose)) { if (LinkInFile(HeadModule, Pathname, ErrorMessage, Verbose)) {
PrintAndReturn(progname, ErrorMessage, std::cerr << progname << ": Error linking in bytecode file '"
": Error linking in bytecode file '" + Pathname + "'"); << Pathname << "': " << ErrorMessage << "\n";
return true; return true;
} }
} }

View File

@ -93,109 +93,17 @@ namespace {
CO6("h", cl::Hidden, cl::desc("Compatibility option: ignored")); CO6("h", cl::Hidden, cl::desc("Compatibility option: ignored"));
} }
namespace llvm { /// PrintAndReturn - Prints a message to standard error and returns true.
/// PrintAndReturn - Prints a message to standard error and returns a value
/// usable for an exit status.
/// ///
/// Inputs: /// Inputs:
/// progname - The name of the program (i.e. argv[0]). /// progname - The name of the program (i.e. argv[0]).
/// Message - The message to print to standard error. /// Message - The message to print to standard error.
/// Extra - Extra information to print between the program name and thei
/// message. It is optional.
/// ///
/// Return value: static int PrintAndReturn(const char *progname, const std::string &Message) {
/// Returns a value that can be used as the exit status (i.e. for exit()). std::cerr << progname << ": " << Message << "\n";
///
int
PrintAndReturn(const char *progname,
const std::string &Message,
const std::string &Extra)
{
std::cerr << progname << Extra << ": " << Message << "\n";
return 1; return 1;
} }
/// CopyEnv - This function takes an array of environment variables and makes a
/// copy of it. This copy can then be manipulated any way the caller likes
/// without affecting the process's real environment.
///
/// Inputs:
/// envp - An array of C strings containing an environment.
///
/// Return value:
/// NULL - An error occurred.
///
/// Otherwise, a pointer to a new array of C strings is returned. Every string
/// in the array is a duplicate of the one in the original array (i.e. we do
/// not copy the char *'s from one array to another).
///
char ** CopyEnv(char ** const envp) {
// Count the number of entries in the old list;
unsigned entries; // The number of entries in the old environment list
for (entries = 0; envp[entries] != NULL; entries++)
/*empty*/;
// Add one more entry for the NULL pointer that ends the list.
++entries;
// If there are no entries at all, just return NULL.
if (entries == 0)
return NULL;
// Allocate a new environment list.
char **newenv = new char* [entries];
if ((newenv = new char* [entries]) == NULL)
return NULL;
// Make a copy of the list. Don't forget the NULL that ends the list.
entries = 0;
while (envp[entries] != NULL) {
newenv[entries] = new char[strlen (envp[entries]) + 1];
strcpy (newenv[entries], envp[entries]);
++entries;
}
newenv[entries] = NULL;
return newenv;
}
/// RemoveEnv - Remove the specified environment variable from the environment
/// array.
///
/// Inputs:
/// name - The name of the variable to remove. It cannot be NULL.
/// envp - The array of environment variables. It cannot be NULL.
///
/// Notes:
/// This is mainly done because functions to remove items from the environment
/// are not available across all platforms. In particular, Solaris does not
/// seem to have an unsetenv() function or a setenv() function (or they are
/// undocumented if they do exist).
///
void RemoveEnv(const char * name, char ** const envp) {
for (unsigned index=0; envp[index] != NULL; index++) {
// Find the first equals sign in the array and make it an EOS character.
char *p = strchr (envp[index], '=');
if (p == NULL)
continue;
else
*p = '\0';
// Compare the two strings. If they are equal, zap this string.
// Otherwise, restore it.
if (!strcmp(name, envp[index]))
*envp[index] = '\0';
else
*p = '=';
}
return;
}
} // end LLVM namespace
/// EmitShellScript - Output the wrapper file that invokes the JIT on the LLVM /// EmitShellScript - Output the wrapper file that invokes the JIT on the LLVM
/// bytecode file for the program. /// bytecode file for the program.
static void EmitShellScript(char **argv) { static void EmitShellScript(char **argv) {

View File

@ -19,23 +19,12 @@
namespace llvm { namespace llvm {
int
PrintAndReturn (const char *progname,
const std::string &Message,
const std::string &Extra = "");
void void
GetAllDefinedSymbols (Module *M, std::set<std::string> &DefinedSymbols); GetAllDefinedSymbols (Module *M, std::set<std::string> &DefinedSymbols);
void void
GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols); GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols);
char **
CopyEnv (char ** const envp);
void
RemoveEnv (const char * name, char ** const envp);
int int
GenerateBytecode (Module * M, GenerateBytecode (Module * M,
bool Strip, bool Strip,