| //===------------------------------------------------------------------------=== |
| // LLVM 'AS' UTILITY |
| // |
| // This utility may be invoked in the following manner: |
| // as --help - Output information about command line switches |
| // as [options] - Read LLVM assembly from stdin, write bytecode to stdout |
| // as [options] x.ll - Read LLVM assembly from the x.ll file, write bytecode |
| // to the x.bc file. |
| // |
| //===------------------------------------------------------------------------=== |
| |
| #include "llvm/Module.h" |
| #include "llvm/Assembly/Parser.h" |
| #include "llvm/Assembly/Writer.h" |
| #include "llvm/Bytecode/Writer.h" |
| #include "Support/CommandLine.h" |
| #include <fstream> |
| #include <string> |
| |
| cl::String InputFilename ("", "Parse <arg> file, compile to bytecode", 0, "-"); |
| cl::String OutputFilename("o", "Override output filename", cl::NoFlags, ""); |
| cl::Flag Force ("f", "Overwrite output files", cl::NoFlags, false); |
| cl::Flag DumpAsm ("d", "Print assembly as parsed", cl::Hidden, false); |
| |
| int main(int argc, char **argv) { |
| cl::ParseCommandLineOptions(argc, argv, " llvm .ll -> .bc assembler\n"); |
| |
| ostream *Out = 0; |
| try { |
| // Parse the file now... |
| Module *C = ParseAssemblyFile(InputFilename); |
| if (C == 0) { |
| cerr << "assembly didn't read correctly.\n"; |
| return 1; |
| } |
| |
| if (DumpAsm) |
| cerr << "Here's the assembly:\n" << C; |
| |
| if (OutputFilename != "") { // Specified an output filename? |
| Out = new ofstream(OutputFilename.c_str(), |
| (Force ? 0 : ios::noreplace)|ios::out); |
| } else { |
| if (InputFilename == "-") { |
| OutputFilename = "-"; |
| Out = &cout; |
| } else { |
| string IFN = InputFilename; |
| int Len = IFN.length(); |
| if (IFN[Len-3] == '.' && IFN[Len-2] == 'l' && IFN[Len-1] == 'l') { |
| // Source ends in .ll |
| OutputFilename = string(IFN.begin(), IFN.end()-3); |
| } else { |
| OutputFilename = IFN; // Append a .bc to it |
| } |
| OutputFilename += ".bc"; |
| Out = new ofstream(OutputFilename.c_str(), |
| (Force ? 0 : ios::noreplace)|ios::out); |
| } |
| |
| if (!Out->good()) { |
| cerr << "Error opening " << OutputFilename << "!\n"; |
| delete C; |
| return 1; |
| } |
| } |
| |
| WriteBytecodeToFile(C, *Out); |
| |
| delete C; |
| } catch (const ParseException &E) { |
| cerr << E.getMessage() << endl; |
| return 1; |
| } |
| |
| if (Out != &cout) delete Out; |
| return 0; |
| } |
| |