mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	No functionality change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239687 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- Interpreter.cpp - Top-Level LLVM Interpreter Implementation --------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file implements the top-level functionality for the LLVM interpreter.
 | |
| // This interpreter is designed to be a very simple, portable, inefficient
 | |
| // interpreter.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "Interpreter.h"
 | |
| #include "llvm/CodeGen/IntrinsicLowering.h"
 | |
| #include "llvm/IR/DerivedTypes.h"
 | |
| #include "llvm/IR/Module.h"
 | |
| #include <cstring>
 | |
| using namespace llvm;
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| static struct RegisterInterp {
 | |
|   RegisterInterp() { Interpreter::Register(); }
 | |
| } InterpRegistrator;
 | |
| 
 | |
| }
 | |
| 
 | |
| extern "C" void LLVMLinkInInterpreter() { }
 | |
| 
 | |
| /// Create a new interpreter object.
 | |
| ///
 | |
| ExecutionEngine *Interpreter::create(std::unique_ptr<Module> M,
 | |
|                                      std::string *ErrStr) {
 | |
|   // Tell this Module to materialize everything and release the GVMaterializer.
 | |
|   if (std::error_code EC = M->materializeAllPermanently()) {
 | |
|     if (ErrStr)
 | |
|       *ErrStr = EC.message();
 | |
|     // We got an error, just return 0
 | |
|     return nullptr;
 | |
|   }
 | |
| 
 | |
|   return new Interpreter(std::move(M));
 | |
| }
 | |
| 
 | |
| //===----------------------------------------------------------------------===//
 | |
| // Interpreter ctor - Initialize stuff
 | |
| //
 | |
| Interpreter::Interpreter(std::unique_ptr<Module> M)
 | |
|   : ExecutionEngine(std::move(M)), TD(Modules.back().get()) {
 | |
| 
 | |
|   memset(&ExitValue.Untyped, 0, sizeof(ExitValue.Untyped));
 | |
|   setDataLayout(&TD);
 | |
|   // Initialize the "backend"
 | |
|   initializeExecutionEngine();
 | |
|   initializeExternalFunctions();
 | |
|   emitGlobals();
 | |
| 
 | |
|   IL = new IntrinsicLowering(TD);
 | |
| }
 | |
| 
 | |
| Interpreter::~Interpreter() {
 | |
|   delete IL;
 | |
| }
 | |
| 
 | |
| void Interpreter::runAtExitHandlers () {
 | |
|   while (!AtExitHandlers.empty()) {
 | |
|     callFunction(AtExitHandlers.back(), None);
 | |
|     AtExitHandlers.pop_back();
 | |
|     run();
 | |
|   }
 | |
| }
 | |
| 
 | |
| /// run - Start execution with the specified function and arguments.
 | |
| ///
 | |
| GenericValue Interpreter::runFunction(Function *F,
 | |
|                                       ArrayRef<GenericValue> ArgValues) {
 | |
|   assert (F && "Function *F was null at entry to run()");
 | |
| 
 | |
|   // Try extra hard not to pass extra args to a function that isn't
 | |
|   // expecting them.  C programmers frequently bend the rules and
 | |
|   // declare main() with fewer parameters than it actually gets
 | |
|   // passed, and the interpreter barfs if you pass a function more
 | |
|   // parameters than it is declared to take. This does not attempt to
 | |
|   // take into account gratuitous differences in declared types,
 | |
|   // though.
 | |
|   const size_t ArgCount = F->getFunctionType()->getNumParams();
 | |
|   ArrayRef<GenericValue> ActualArgs =
 | |
|       ArgValues.slice(0, std::min(ArgValues.size(), ArgCount));
 | |
| 
 | |
|   // Set up the function call.
 | |
|   callFunction(F, ActualArgs);
 | |
| 
 | |
|   // Start executing the function.
 | |
|   run();
 | |
| 
 | |
|   return ExitValue;
 | |
| }
 |