LLVM: класс «Экспорт» - PullRequest
4 голосов
/ 28 мая 2011

Я бы хотел вызвать этот код из моей программы, используя LLVM:

#include <string>
#include <iostream>
extern "C" void hello() {
        std::cout << "hello" << std::endl;
}

class Hello {
public:
  Hello() {
    std::cout <<"Hello::Hello()" << std::endl;
  };

  int hello() {
    std::cout<< "Hello::hello()" << std::endl;
    return 99;
  };
};

Я скомпилировал этот код в байт-код llvm, используя clang++ -emit-llvm -c -o hello.bc hello.cpp, а затем хочу вызвать его из этой программы:

#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ExecutionEngine/GenericValue.h>
#include <llvm/ExecutionEngine/JIT.h>
#include <llvm/LLVMContext.h>
#include <llvm/Module.h>
#include <llvm/Target/TargetSelect.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/Support/IRReader.h>

#include <string>
#include <iostream>
#include <vector>
using namespace std;
using namespace llvm;

void callFunction(string file, string function) {
  InitializeNativeTarget();
  LLVMContext context;
  string error;

  MemoryBuffer* buff = MemoryBuffer::getFile(file);
  assert(buff);
  Module* m = getLazyBitcodeModule(buff, context, &error);
  ExecutionEngine* engine = ExecutionEngine::create(m);    
  Function* func = m->getFunction(function);

  vector<GenericValue> args(0);    
  engine->runFunction(func, args);

  func = m->getFunction("Hello::Hello");
  engine->runFunction(func, args);
}

int main() {
  callFunction("hello.bc", "hello");
}

(составлено с использованием g++ -g main.cpp 'llvm-config --cppflags --ldflags --libs core jit native bitreader')

Я могу без проблем вызвать функцию hello(). Мой вопрос: как я могу создать новый экземпляр класса Hello, используя LLVM? У меня ошибка сегментации, когда я звоню Hello::Hello()

Спасибо за любые подсказки !!

Manuel

1 Ответ

3 голосов
/ 28 мая 2011

Запуск clang++ -emit-llvm на указанном источнике не будет излучать Hello :: Hello, а m->getFunction("Hello::Hello") не найдет его, даже если он был отправлен.Я бы предположил, что это происходит сбой, потому что func является нулевым.

Попытка прямого вызова функций, которые не extern "C" из JL LLVM, как правило, не рекомендуется ... Я бы предложил написать оболочку, такую ​​каки компилируем его с помощью clang (или используя clang API, в зависимости от того, что вы делаете):

extern "C" Hello* Hello_construct() {
  return new Hello;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...