34
34
#include " llvm/IR/Verifier.h"
35
35
#include " llvm/IRReader/IRReader.h"
36
36
#include " llvm/InitializePasses.h"
37
+ #include " llvm/Linker/Linker.h"
37
38
#include " llvm/LinkAllIR.h"
38
39
#include " llvm/LinkAllPasses.h"
39
40
#include " llvm/MC/SubtargetFeature.h"
@@ -76,9 +77,9 @@ static cl::opt<std::string> PassPipeline(
76
77
77
78
// Other command line options...
78
79
//
79
- static cl::opt <std::string>
80
- InputFilename (cl::Positional, cl::desc( " <input bitcode file> " ) ,
81
- cl::init( " - " ), cl::value_desc( " filename " ));
80
+ static cl::list <std::string> // XXX EMSCRIPTEN: support multiple input files, link them
81
+ InputFilenames (cl::Positional, cl::ZeroOrMore ,
82
+ cl::desc ( " <input bitcode files> " ));
82
83
83
84
static cl::opt<std::string>
84
85
OutputFilename (" o" , cl::desc(" Override output filename" ),
@@ -462,7 +463,40 @@ int main(int argc, char **argv) {
462
463
SMDiagnostic Err;
463
464
464
465
// Load the input module...
465
- std::unique_ptr<Module> M = parseIRFile (InputFilename, Err, Context);
466
+ std::unique_ptr<Module> M;
467
+
468
+ // XXX EMSCRIPTEN: support for multiple files
469
+ if (InputFilenames.size () == 0 )
470
+ M = parseIRFile (" -" , Err, Context);
471
+ else if (InputFilenames.size () == 1 )
472
+ M = parseIRFile (InputFilenames[0 ], Err, Context);
473
+ else {
474
+ // link them in
475
+ M = nullptr ;
476
+ std::unique_ptr<Linker> L;
477
+
478
+ for (unsigned i = 0 ; i < InputFilenames.size (); ++i) {
479
+ std::unique_ptr<Module> MM = parseIRFile (InputFilenames[i], Err, Context);
480
+ if (!MM.get ()) {
481
+ errs () << argv[0 ] << " : error loading file '" <<InputFilenames[i]<< " '\n " ;
482
+ return 1 ;
483
+ }
484
+
485
+ if (!NoVerify && verifyModule (*MM, &errs ())) {
486
+ errs () << argv[0 ] << " : " << InputFilenames[i]
487
+ << " : error: input module is broken!\n " ;
488
+ return 1 ;
489
+ }
490
+
491
+ if (i == 0 ) {
492
+ M.swap (MM);
493
+ L = make_unique<Linker>(M.get ());
494
+ } else {
495
+ if (L->linkInModule (MM.get ()))
496
+ return 1 ;
497
+ }
498
+ }
499
+ }
466
500
467
501
if (!M) {
468
502
Err.print (argv[0 ], errs ());
@@ -477,7 +511,7 @@ int main(int argc, char **argv) {
477
511
// pass pipelines. Otherwise we can crash on broken code during
478
512
// doInitialization().
479
513
if (!NoVerify && verifyModule (*M, &errs ())) {
480
- errs () << argv[0 ] << " : " << InputFilename
514
+ errs () << argv[0 ] << " : "
481
515
<< " : error: input module is broken!\n " ;
482
516
return 1 ;
483
517
}
0 commit comments