Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- set -x # print commands
- set -e # abort on error
- WORKS=works.bc
- WORKS2=works2.bc
- CRASHES=crashes.bc
- PROGRAM=program
- clang++ $(llvm-config --cxxflags) -c -x c++ - -emit-llvm -o $WORKS <<EOF
- #include <iostream>
- class A {
- public:
- A(void) {
- std::cout << "AAA\n";
- }
- };
- extern "C" {
- void makeit() { A(); }
- }
- EOF
- clang++ -O2 $(llvm-config --cxxflags) -c -x c++ - -emit-llvm -o $WORKS2 <<EOF
- #include <iostream>
- class B {
- public:
- B(void);
- };
- B::B(void) {
- std::cout << "BBB\n";
- }
- extern "C" {
- void makeit() { B(); }
- }
- EOF
- clang++ $(llvm-config --cxxflags) -c -x c++ - -emit-llvm -o $CRASHES <<EOF
- #include <iostream>
- class C {
- public:
- C(void);
- };
- C::C(void) {
- std::cout << "CCC\n";
- }
- extern "C" {
- void makeit() { C(); }
- }
- EOF
- clang++ $(llvm-config --cxxflags) -x c++ - $(llvm-config --ldflags) $(llvm-config --libs jit native BitReader) -o $PROGRAM <<EOF
- #include <iostream>
- #include <llvm/LLVMContext.h>
- #include <llvm/Target/TargetSelect.h>
- #include <llvm/Bitcode/ReaderWriter.h>
- #include <llvm/ExecutionEngine/ExecutionEngine.h>
- #include <llvm/Support/MemoryBuffer.h>
- #include <llvm/ExecutionEngine/JIT.h>
- #include <llvm/ADT/OwningPtr.h>
- #include "llvm/Support/system_error.h"
- using namespace std;
- using namespace llvm;
- int main(int argc, char** argv)
- {
- if(argc<=1) {
- return 1;
- }
- const char* filename = argv[1];
- InitializeNativeTarget();
- llvm_start_multithreaded();
- LLVMContext context;
- OwningPtr<MemoryBuffer> buffer;
- if (error_code ec = MemoryBuffer::getFile(filename, buffer)) {
- return 1;
- } else {
- std::string ParseErrorMessage;
- Module* m = ParseBitcodeFile(buffer.get(), context, &ParseErrorMessage);
- if(m) {
- ExecutionEngine *ee = ExecutionEngine::create(m);
- Function* func = ee->FindFunctionNamed("makeit");
- if(func) {
- typedef void (*PFN)();
- cout << "starting to JIT makeit" << endl;
- PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
- pfn();
- } else {
- return 1;
- }
- delete ee;
- } else {
- return 1;
- }
- }
- return 0;
- }
- EOF
- ./$PROGRAM $WORKS
- ./$PROGRAM $WORKS2
- ./$PROGRAM $CRASHES
- cat << EOF
- $ clang -v
- clang version 3.0 (http://llvm.org/git/clang.git ec5bc81fd55bfcc26fc4bde6d5e33113d94c2209)
- Target: i386-pc-linux-gnu
- Thread model: posix
- $ llvmc --version
- Low Level Virtual Machine (http://llvm.org/):
- llvm version 3.0svn
- DEBUG build with assertions.
- Built Aug 23 2011 (12:10:27).
- Host: i386-pc-linux-gnu
- Host CPU: penryn
- EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement