mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	args as the objects they represent and the "right thing" will happen git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===------------------------------------------------------------------------===
 | 
						|
// 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 <iostream.h>
 | 
						|
#include <fstream.h>
 | 
						|
#include <string>
 | 
						|
#include "llvm/Module.h"
 | 
						|
#include "llvm/Assembly/Parser.h"
 | 
						|
#include "llvm/Assembly/Writer.h"
 | 
						|
#include "llvm/Bytecode/Writer.h"
 | 
						|
#include "llvm/Support/CommandLine.h"
 | 
						|
 | 
						|
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;
 | 
						|
}
 | 
						|
 |