mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
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:
parent
7e88d418bb
commit
0ebee7410f
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user