Chris Lattner | 4c6d124 | 2004-06-01 23:48:45 +0000 | [diff] [blame^] | 1 | /*===- llvm-stub.c - Stub executable to run llvm bytecode files -----------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file was developed by the LLVM research group and is distributed under |
| 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This tool is used by the gccld program to enable transparent execution of |
| 11 | // bytecode files by the user. Specifically, gccld outputs two files when asked |
| 12 | // to compile a <program> file: |
| 13 | // 1. It outputs the LLVM bytecode file to <program>.bc |
| 14 | // 2. It outputs a stub executable that runs lli on <program>.bc |
| 15 | // |
| 16 | // This allows the end user to just say ./<program> and have the JIT executed |
| 17 | // automatically. On unix, the stub executable emitted is actually a bourne |
| 18 | // shell script that does the forwarding. Windows doesn't not like #!/bin/sh |
| 19 | // programs in .exe files, so we make it an actual program, defined here. |
| 20 | // |
| 21 | //===----------------------------------------------------------------------===*/ |
| 22 | |
| 23 | #include <stdio.h> |
| 24 | #include <stdlib.h> |
| 25 | #include <string.h> |
| 26 | #include "Config/unistd.h" /* provides definition of execve */ |
| 27 | |
| 28 | int main(int argc, char** argv) { |
| 29 | const char *Interp = getenv("LLVMINTERP"); |
| 30 | const char **Args; |
| 31 | if (Interp == 0) Interp = "lli"; |
| 32 | |
| 33 | /* Set up the command line options to pass to the JIT. */ |
| 34 | Args = (const char**)malloc(sizeof(char*) * (argc+2)); |
| 35 | /* argv[0] is the JIT */ |
| 36 | Args[0] = Interp; |
| 37 | /* argv[1] is argv[0] + ".bc". */ |
| 38 | Args[1] = strcat(strcpy((char*)malloc(strlen(argv[0])+4), argv[0]), ".bc"); |
| 39 | |
| 40 | /* The rest of the args are as before. */ |
| 41 | memcpy(Args+2, argv+1, sizeof(char*)*argc); |
| 42 | |
| 43 | /* Run the JIT. */ |
| 44 | execvp(Interp, (char *const*)Args); |
| 45 | |
| 46 | /* if _execv returns, the JIT could not be started. */ |
| 47 | fprintf(stderr, "Could not execute the LLVM JIT. Either add 'lli' to your" |
| 48 | " path, or set the\ninterpreter you want to use in the LLVMINTERP " |
| 49 | "environment variable.\n"); |
| 50 | return 1; |
| 51 | } |