2013-08-25 3 views
3

Я пробую очень простой пример с LLVM/clang и, похоже, не работает.Связывание нескольких модулей LLVM C++ вместе segfaults в lli

Стараюсь следующее:

  1. лязга ++ -emit-LLVM -c -x C++ -o main.bc -isystem включает/main.cc
  2. лязга ++ -emit-LLVM -c -x C++ -o test_class.bc -isystem включают в себя/test_class.cc
  3. LLVM-ссылку main.bc test_class.bc -o all.bc
  4. ЛЛИ all.bc

Однако 4. терпит неудачу (возвращает ошибку сегментации) с:

0 libLLVM-3.3.so 0x0000003b890f9e52 llvm::sys::PrintStackTrace(_IO_FILE*) + 34 
1 libLLVM-3.3.so 0x0000003b890f9cb9 
2 libpthread.so.0 0x0000003b8520efa0 
3 libLLVM-3.3.so 0x0000003b89982790 llvm::MachineJumpTableInfo::getEntrySize(llvm::DataLayout const&) const + 0 
4 libLLVM-3.3.so 0x0000003b894bfb23 
5 libLLVM-3.3.so 0x0000003b894c8dc3 
6 libLLVM-3.3.so 0x0000003b8981b27f 
7 libLLVM-3.3.so 0x0000003b8969d2d6 llvm::FPPassManager::runOnFunction(llvm::Function&) + 422 
8 libLLVM-3.3.so 0x0000003b8969d3f6 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 102 
9 libLLVM-3.3.so 0x0000003b8969d4cb llvm::FunctionPassManager::run(llvm::Function&) + 91 
10 libLLVM-3.3.so 0x0000003b894b3264 llvm::JIT::jitTheFunction(llvm::Function*, llvm::MutexGuard const&) + 36 
11 libLLVM-3.3.so 0x0000003b894b394f llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard const&) + 15 
12 libLLVM-3.3.so 0x0000003b894b3b7e llvm::JIT::getPointerToFunction(llvm::Function*) + 254 
13 libLLVM-3.3.so 0x0000003b894c6649 
14 libLLVM-3.3.so 0x0000003b894c909c 
15 libLLVM-3.3.so 0x0000003b8981b27f 
16 libLLVM-3.3.so 0x0000003b8969d2d6 llvm::FPPassManager::runOnFunction(llvm::Function&) + 422 
17 libLLVM-3.3.so 0x0000003b8969d3f6 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 102 
18 libLLVM-3.3.so 0x0000003b8969d4cb llvm::FunctionPassManager::run(llvm::Function&) + 91 
19 libLLVM-3.3.so 0x0000003b894b3264 llvm::JIT::jitTheFunction(llvm::Function*, llvm::MutexGuard const&) + 36 
20 libLLVM-3.3.so 0x0000003b894b394f llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard const&) + 15 
21 libLLVM-3.3.so 0x0000003b894b3b7e llvm::JIT::getPointerToFunction(llvm::Function*) + 254 
22 lli    0x00000000004073cf main + 2527 
23 libc.so.6  0x0000003b84621b75 __libc_start_main + 245 
24 lli    0x000000000040a271 
Stack dump: 
0.  Program arguments: lli all.bc 
1.  Running pass 'X86 Machine Code Emitter' on function '@main' 
2.  Running pass 'X86 Machine Code Emitter' on function '@_ZN10test_classC2ESs' 
[1] 15327 segmentation fault (core dumped) lli all.bc 

Есть ли у меня фундаментальное непонимание того, как это должно работать? Моя конечная цель - сделать компиляцию , используя API libclang, но пока что понимание того, что я делаю неправильно, было бы потрясающе! Благодаря!

Я приложил исходный код в примере ниже:

включают в себя/test_class.h:

#ifndef __TEST_CLASS_H__ 
#define __TEST_CLASS_H__ 

#include <string> 
#include <iostream> 

struct test_class 
{ 
    test_class(std::string foo); 
    ~test_class(); 

    std::string foo; 
}; 

#endif 

test_class.cc:

#include <test_class.h> 

test_class::test_class(std::string foo) : foo(foo) 
{ 
    std::cout << foo << std::endl; 
} 

test_class::~test_class(void) 
{ 
} 

main.cc:

#include <cstdlib> 
#include <string> 
#include <iostream> 

#include <test_class.h> 

int main(int argc, char** argv) 
{ 
    test_class test("foo"); 

    return EXIT_SUCCESS; 
} 

ответ

0

В test_class вы ссылаетесь на std::string. I Угадайте, вызовы связанных функций отмечены external, если вы посмотрите в ИК (например: llvm-dis < all.bc).

Если вы скомпилируете «нормальный» исполняемый код, эти вызовы разрешаются компоновщиком. Поскольку вы связываетесь вручную с llvm-link, вам необходимо предоставить IR-код для библиотек C++, иначе выполнение может завершиться неудачей.

+0

Спасибо за ваш ответ, но не исправил его. –

+0

Можете ли вы подтвердить мою теорию? Если это так, решение является нетривиальным, потому что вам необходимо управлять компиляцией библиотек C++ (+ их зависимостей) с IR-кодом. Связывание с двоичным (как в «обычном» процессе компиляции) здесь невозможно. –

+0

Даже если я удалю std :: string и std :: cout, то произойдет то же самое. Спасибо, в любом случае. –