2014-11-16 2 views
3

У меня есть функция, определенная в другом файле cpp, который я хотел бы использовать в LLVM IR. Не могли бы вы рассказать мне, как мне их использовать и связать.LLVM используя внешнюю функцию

Я сделал следующий

FunctionType *joinTy = FunctionType::get(voidTy, false); 
Function *join = Function::Create(joinTy, Function::ExternalLinkage,"join", &M); 
join->setCallingConv(CallingConv::C); 

И назвал его следующим образом:

Function *join = (&M)->getFunction("join"); 
CallInst * calljoin = CallInst::Create(join,"",branchInst); 

У меня есть функция присоединиться к внешней файловой threads.cpp как

void join() { 
     printf("join\n"); 
     int i; 
     for (i = 0; i < NUM_THREADS; i++) { 
       if (threads[i]) { 
         pthread_join(threads[i], NULL); 
       } 
     } 
} 

И I имеют файл .bc (LLVM IR), который я компилирую в .s, используя llc. Я компилирую threads.cpp в threads.o используя g++ -c threads.cpp. Теперь я пытаюсь связать их как

g++ -o exe test.bc threads.o -pthreads 

Я получаю сообщение об ошибке:

undefined reference to join

Даже если я четко увязываются требуемый файл. Любая помощь?

ответ

2

Во-первых, g ++ не понимает биткод LLVM (файл .bc). Все, что есть бинарное представление LLVM IR, поэтому вы не можете связать IR с объектными файлами.

Если вы хотите установить связь с LLVM, вы можете использовать llvm-link. Это потребует, чтобы вы также скомпилировали ваши pthreads для LLVM (clang также поддерживает параметр -pthread).

Это должно взять Вас остальная часть пути:

LLVM insert pthread function calls into IR

Смежные вопросы