[LLVMdev] llvm interpreter cannot execute llvm-gcc generated bitcode

Kristaps Straupe kstraupe at gmail.com
Thu Jan 28 08:52:06 PST 2010


Hi!

We are compiling a very large C project in llvm and trying to execute
it in interpreter. There is a problem with executing the generated
bitcode.

We are using lli.exe and llvm-gcc.exe from official 2.6 LLVM release.

We have localized the problem to following c code:
--------------------
int f(unsigned char x) __attribute__((noinline));

int f(unsigned char x)
{
  return x - 1;
}

int main()
{
   return f(1);
}
--------------------


Which generates following llvm assembly:
----------
; ModuleID = 'a.o'
target datalayout =
"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
target triple = "i386-mingw32"

define i32 @f(i8 zeroext %x) nounwind readnone noinline {
entry:
  %0 = zext i8 %x to i32                          ; <i32> [#uses=1]
  %1 = add i32 %0, -1                             ; <i32> [#uses=1]
  ret i32 %1
}

define i32 @main() nounwind readnone {
entry:
  %0 = tail call i32 @f(i8 zeroext 1) nounwind    ; <i32> [#uses=1]
  ret i32 %0
}
-----------


Finally calling it with:
----------
llvm-gcc -c -emit-llvm -O2 a.c
lli -force-interpreter a.o
----------

Yields us:
-----------
"Assertion failed: width > BitWidth && "Invalid APInt ZeroExtend
request", file c:/proj/llvm/src/lib/Support/APInt.cpp, line 1064"
-----------
where both width and BitWidth have value "32".


Removing this assert in llvm source makes more similar (APInt related)
asserts fail later.

Is that a problem with llvm-gcc or is there a fix in llvm source available?


Thank you and we hope to hear from you soon.



More information about the llvm-dev mailing list