summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorarphaman <arphaman@gmail.com>2013-07-17 16:47:38 +0100
committerarphaman <arphaman@gmail.com>2013-07-17 16:47:38 +0100
commit44a93699b70f1e81fee333e8c49ea396ff1f5d6e (patch)
tree1c7469e4a38648d948725039482b14f4fcb4a4b5 /tools
parentd5fc85478314db03f3b2574f962f4b98306c612a (diff)
downloadflang-44a93699b70f1e81fee333e8c49ea396ff1f5d6e.tar.gz
added linking driver to driver
Diffstat (limited to 'tools')
-rw-r--r--tools/driver/Main.cpp54
1 files changed, 46 insertions, 8 deletions
diff --git a/tools/driver/Main.cpp b/tools/driver/Main.cpp
index 80349331c7..4af2c1cd4a 100644
--- a/tools/driver/Main.cpp
+++ b/tools/driver/Main.cpp
@@ -64,7 +64,7 @@ llvm::sys::Path GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) {
namespace {
cl::opt<std::string>
- InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
+ InputFiles(cl::Positional, cl::desc("<input file>"), cl::init("-"));
cl::list<std::string>
IncludeDirs("I", cl::desc("Directory of include files"),
@@ -88,6 +88,15 @@ namespace {
cl::opt<std::string>
OutputFile("o", cl::desc("<output file>"), cl::init(""));
+ cl::list<std::string>
+ LinkDirectories("L", cl::desc("Additional directory for library files"));
+
+ cl::list<std::string>
+ LinkLibraries("l", cl::desc("Additional libraries"));
+
+ cl::opt<bool>
+ CompileOnly("c", cl::desc("compile only, do not link"), cl::init(false));
+
} // end anonymous namespace
@@ -156,8 +165,27 @@ static bool EmitOutputFile(const std::string &Input,
return EmitFile(Out, Module, TM, Action);
}
+static bool LinkFiles(ArrayRef<std::string> OutputFiles) {
+ const char *Driver = "gcc";
+ std::string Cmd;
+ llvm::raw_string_ostream OS(Cmd);
+ OS << Driver;
+ for(const std::string &I : OutputFiles)
+ OS << " " << I;
+ for(const std::string &I : LinkDirectories)
+ OS << " -L " << I;
+ for(const std::string &I : LinkLibraries)
+ OS << " -l " << I;
+ OS << " -l libflang";
+ if(OutputFile.size())
+ OS << " -o " << OutputFile;
+ Cmd = OS.str();
+ return system(Cmd.c_str());
+}
+
static bool ParseFile(const std::string &Filename,
- const std::vector<std::string> &IncludeDirs) {
+ const std::vector<std::string> &IncludeDirs,
+ SmallVectorImpl<std::string> &OutputFiles) {
llvm::OwningPtr<llvm::MemoryBuffer> MB;
if (llvm::error_code ec = llvm::MemoryBuffer::getFileOrSTDIN(Filename.c_str(),
MB)) {
@@ -199,7 +227,7 @@ static bool ParseFile(const std::string &Filename,
Dumper->HandleTranslationUnit(Context);
- if(!SyntaxOnly) {
+ if(!SyntaxOnly && !Diag.hadErrors()) {
auto CG = CreateLLVMCodeGen(Diag, Filename == ""? std::string("module") : Filename,
CodeGenOptions(), flang::TargetOptions(), llvm::getGlobalContext());
CG->Initialize(Context);
@@ -216,11 +244,13 @@ static bool ParseFile(const std::string &Filename,
auto TM = TheTarget->createTargetMachine(TheTriple.getTriple(), "", "", llvm::TargetOptions());
if(OutputFile == "-")
EmitFile(llvm::outs(), CG->GetModule(), TM, BA);
- else
- EmitOutputFile(GetOutputName(Filename, BA), CG->GetModule(), TM, BA);
+ else {
+ OutputFiles.push_back(GetOutputName(Filename, BA));
+ EmitOutputFile(OutputFiles.back(), CG->GetModule(), TM, BA);
+ }
}
- return Diag.hadErrors() || Diag.hadWarnings();
+ return Diag.hadErrors();
}
int main(int argc, char **argv) {
@@ -243,12 +273,20 @@ int main(int argc, char **argv) {
llvm::InitializeAllAsmParsers();
// Parse the input file.
- int Res = ParseFile(InputFilename, IncludeDirs);
+ bool HadErrors = false;
+ SmallVector <std::string, 32> OutputFiles;
+ OutputFiles.reserve(1);
+
+ if(ParseFile(InputFiles, IncludeDirs, OutputFiles)) {
+ HadErrors = true;
+ }
+ if(!HadErrors && !CompileOnly && !EmitLLVM && !EmitASM)
+ LinkFiles(OutputFiles);
// If any timers were active but haven't been destroyed yet, print their
// results now. This happens in -disable-free mode.
llvm::TimerGroup::printAll(llvm::errs());
llvm::llvm_shutdown();
- return Res;
+ return HadErrors;
}