Merge branch 'dmd-2.060' into master.

Conflicts:
	dmd2/func.c
	dmd2/mars.c
This commit is contained in:
David Nadlinger
2012-09-07 04:15:44 +02:00
143 changed files with 18692 additions and 18365 deletions

View File

@@ -593,7 +593,8 @@ Params parseArgs(int originalArgc, char** originalArgv, ls::Path ldcPath)
goto Lerror;
result.debugLevel = (int)level;
}
result.debugIdentifiers.push_back(p + 7);
else
result.debugIdentifiers.push_back(p + 7);
}
else if (p[6])
goto Lerror;
@@ -616,7 +617,8 @@ Params parseArgs(int originalArgc, char** originalArgv, ls::Path ldcPath)
goto Lerror;
result.versionLevel = (int)level;
}
result.versionIdentifiers.push_back(p + 9);
else
result.versionIdentifiers.push_back(p + 9);
}
else
goto Lerror;
@@ -769,11 +771,11 @@ void buildCommandLine(std::vector<const char*>& r, const Params& p)
if (p.debugFlag) r.push_back("-d-debug");
if (p.debugLevel) r.push_back(concat("-d-debug=", p.debugLevel));
pushSwitches("-d-debug=", p.debugIdentifiers, r);
if (p.debugLevel) r.push_back(concat("-d-version=", p.versionLevel));
if (p.versionLevel) r.push_back(concat("-d-version=", p.versionLevel));
pushSwitches("-d-version=", p.versionIdentifiers, r);
pushSwitches("-L=", p.linkerSwitches, r);
if (p.defaultLibName) r.push_back(concat("-defaultlib=", p.defaultLibName));
if (p.debugLibName) r.push_back(concat("-deps=", p.moduleDepsFile));
if (p.debugLibName) r.push_back(concat("-debuglib=", p.debugLibName));
if (p.hiddenDebugB) r.push_back("-hidden-debug-b");
if (p.hiddenDebugC) r.push_back("-hidden-debug-c");
if (p.hiddenDebugF) r.push_back("-hidden-debug-f");

View File

@@ -58,167 +58,6 @@ void linkModules(llvm::Module* dst, const Module_vector& MV)
static llvm::sys::Path gExePath;
int linkExecutable(const char* argv0)
{
Logger::println("*** Linking executable ***");
// error string
std::string errstr;
// find the llvm-ld program
llvm::sys::Path ldpath = llvm::sys::Program::FindProgramByName("llvm-ld");
if (ldpath.isEmpty())
{
ldpath.set("llvm-ld");
}
// build arguments
std::vector<const char*> args;
// first the program name ??
args.push_back("llvm-ld");
// output filename
std::string exestr;
if (global.params.exefile)
{ // explicit
exestr = global.params.exefile;
}
else
{ // inferred
// try root module name
if (Module::rootModule)
exestr = Module::rootModule->toChars();
else
exestr = "a.out";
}
if (global.params.os == OSWindows && !(exestr.substr(exestr.length()-4) == ".exe"))
exestr.append(".exe");
std::string outopt = "-o=" + exestr;
args.push_back(outopt.c_str());
// set the global gExePath
gExePath.set(exestr);
assert(gExePath.isValid());
// create path to exe
llvm::sys::Path exedir(llvm::sys::path::parent_path(gExePath.str()));
if (!llvm::sys::fs::exists(exedir.str()))
{
exedir.createDirectoryOnDisk(true, &errstr);
if (!errstr.empty())
{
error("failed to create path to linking output: %s\n%s", exedir.c_str(), errstr.c_str());
fatal();
}
}
// strip debug info
if (!global.params.symdebug)
args.push_back("-strip-debug");
// optimization level
if (!optimize())
args.push_back("-disable-opt");
else
{
switch(optLevel())
{
case 0:
args.push_back("-disable-opt");
break;
case 1:
args.push_back("-globaldce");
args.push_back("-disable-opt");
args.push_back("-globaldce");
args.push_back("-mem2reg");
case 2:
case 3:
case 4:
case 5:
// use default optimization
break;
default:
assert(0);
}
}
// inlining
if (!(global.params.useInline || doInline()))
{
args.push_back("-disable-inlining");
}
// additional linker switches
for (unsigned i = 0; i < global.params.linkswitches->dim; i++)
{
char *p = static_cast<char *>(global.params.linkswitches->data[i]);
args.push_back(p);
}
// native please
args.push_back("-native");
// user libs
for (unsigned i = 0; i < global.params.libfiles->dim; i++)
{
char *p = static_cast<char *>(global.params.libfiles->data[i]);
args.push_back(p);
}
// default libs
switch(global.params.os) {
case OSLinux:
case OSMacOSX:
args.push_back("-ldl");
case OSFreeBSD:
args.push_back("-lpthread");
args.push_back("-lm");
break;
case OSHaiku:
args.push_back("-lroot");
break;
case OSWindows:
// FIXME: I'd assume kernel32 etc
break;
}
// object files
for (unsigned i = 0; i < global.params.objfiles->dim; i++)
{
char *p = static_cast<char *>(global.params.objfiles->data[i]);
args.push_back(p);
}
// print link command?
if (!quiet || global.params.verbose)
{
// Print it
for (int i = 0; i < args.size(); i++)
printf("%s ", args[i]);
printf("\n");
fflush(stdout);
}
// terminate args list
args.push_back(NULL);
// try to call linker!!!
if (int status = llvm::sys::Program::ExecuteAndWait(ldpath, &args[0], NULL, NULL, 0,0, &errstr))
{
error("linking failed:\nstatus: %d", status);
if (!errstr.empty())
error("message: %s", errstr.c_str());
return status;
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////
int linkObjToBinary(bool sharedLib)
{
Logger::println("*** Linking executable ***");
@@ -244,6 +83,13 @@ int linkObjToBinary(bool sharedLib)
args.push_back(p);
}
// user libs
for (unsigned i = 0; i < global.params.libfiles->dim; i++)
{
char *p = static_cast<char *>(global.params.libfiles->data[i]);
args.push_back(p);
}
// output filename
std::string output;
if (!sharedLib && global.params.exefile)
@@ -308,13 +154,6 @@ int linkObjToBinary(bool sharedLib)
args.push_back(p);
}
// user libs
for (unsigned i = 0; i < global.params.libfiles->dim; i++)
{
char *p = static_cast<char *>(global.params.libfiles->data[i]);
args.push_back(p);
}
// default libs
bool addSoname = false;
switch(global.params.os) {

View File

@@ -18,13 +18,6 @@ namespace llvm
*/
void linkModules(llvm::Module* dst, const std::vector<llvm::Module*>& MV);
/**
* Link an executable.
* @param argv0 the argv[0] value as passed to main
* @return 0 on success.
*/
int linkExecutable(const char* argv0);
/**
* Link an executable only from object files.
* @param argv0 the argv[0] value as passed to main
@@ -38,12 +31,12 @@ int linkObjToBinary(bool sharedLib);
void createStaticLibrary();
/**
* Delete the executable that was previously linked with linkExecutable.
* Delete the executable that was previously linked with linkObjToBinary.
*/
void deleteExecutable();
/**
* Runs the executable that was previously linked with linkExecutable.
* Runs the executable that was previously linked with linkObjToBinary.
* @return the return status of the executable.
*/
int runExecutable();

View File

@@ -23,6 +23,11 @@
#include "rmem.h"
#include "root.h"
// stricmp
#if __GNUC__ && !_WIN32
#include "gnuc.h"
#endif
#include "mars.h"
#include "module.h"
#include "mtype.h"
@@ -835,10 +840,7 @@ int main(int argc, char** argv)
#endif
if (stricmp(ext, global.mars_ext) == 0 ||
stricmp(ext, global.hdr_ext) == 0 ||
stricmp(ext, "htm") == 0 ||
stricmp(ext, "html") == 0 ||
stricmp(ext, "xhtml") == 0)
stricmp(ext, global.hdr_ext) == 0)
{
ext--; // skip onto '.'
assert(*ext == '.');