2014-02-01 3 views
0

Может ли кто-нибудь сказать мне, в чем проблема с этим кодом LLVM-IR, который вызывает segmentation faulta и как его решить?ошибка сегментации с llvm-ir

%mytype = type {i32 (...)**} 
%mytype2 = type {i32, %mytype**} 
... 
%obj = load %mytype2** %myobj 
%get = getelementptr inbounds %mytype2* %obj, i32 0, i32 1 
%ml = mul i32 4, 4 
%naj = call noalias i8* @_Znaj(i32 %ml) 
%cast = bitcast i8* %naj to %mytype** 
store %mytype** %cast, %mytype*** %get 

%get2 = getelementptr %mytype** %get, i32 0 

%ld = load %mytype** %get2 

ответ

2

Линия

%get2 = getelementptr %mytype** %get, i32 0 

является незаконным, так как тип %get является %mytype***, не %mytype**. Кроме того, поскольку gep something i32 0 всегда является nop, я предполагаю, что вы действительно хотели что-то еще здесь.

В целом, я рекомендую использовать LLVM's verify pass (запустите opt -verify) на вашем IR, чтобы проверить, законно это или нет. Вы также можете попробовать мой IR editor plugin for Eclipse, который не работает, как хорошо, но дает вам хороший отклик GUI:

type error on the gep

Вы должны исправить код, чтобы быть законным:

%get2 = load %mytype*** %get 
%ld = load %mytype** %get2 

Если вы получаете segfault во время выполнения при выполнении этих строк, это означает либо первый, либо второй загруженный доступ к нераспределенной памяти. Чтобы выяснить причину этого, вам нужно изучить, как вы размещаете объект %myobj и его поля.

+0

Вы правы. Я должен был использовать% get2 = load% mytype ***% get вместо% get2 = getelementptr% mytype **% get, i32 0. Однако моя проблема - это нечто иное, чем синтаксическая ошибка: я получаю ошибку seg для этих инструкций: (1)% get2 = load% mytype ***% get (2)% ld = load% mytype **% get2 (3)% content = getelementptr% mytype *% ld, i32 2 – user1723583

+0

@ user1723583 Вы получаете segfault при построении/обработке IR или segfault при запуске кода, генерируемого из этого IR? – Oak

+0

, когда я запускаю код – user1723583

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