[LLVMdev] AsmParser fails

Fabian Scheler fabian.scheler at gmail.com
Mon Jul 9 06:41:33 PDT 2007


Hello everybody,

unfortunately, I have some problems using the LLVM assembler parser ...

-  use llvm-gcc ( llvm-gcc -O0 -S --emit-llvm -o system2.ll system2.c)
to translate the following small example into LLVM assembly language:

int common_func1() {
  return 5;
}

int common_func2(int a) {
  return a + 5;
}

void Handler1() {
  int e = 4;
  int f = common_func1();
  int ret =  common_func2(e);
}

void Handler2() {
  int ret = common_func2(common_func1() + 3 - 2 * 5);
}

- this yields the following LLVM assembly listing:

; ModuleID = 'system2.c'
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"
target triple = "i686-pc-linux-gnu"

define i32 @common_func1() {
entry:
	%retval = alloca i32, align 4		; <i32*> [#uses=2]
	%tmp = alloca i32, align 4		; <i32*> [#uses=2]
	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
	store i32 5, i32* %tmp
	%tmp1 = load i32* %tmp		; <i32> [#uses=1]
	store i32 %tmp1, i32* %retval
	br label %return

return:		; preds = %entry
	%retval2 = load i32* %retval		; <i32> [#uses=1]
	ret i32 %retval2
}

define i32 @common_func2(i32 %a) {
entry:
	%a_addr = alloca i32		; <i32*> [#uses=2]
	%retval = alloca i32, align 4		; <i32*> [#uses=2]
	%tmp = alloca i32, align 4		; <i32*> [#uses=2]
	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
	store i32 %a, i32* %a_addr
	%tmp1 = load i32* %a_addr		; <i32> [#uses=1]
	%tmp2 = add i32 %tmp1, 5		; <i32> [#uses=1]
	store i32 %tmp2, i32* %tmp
	%tmp3 = load i32* %tmp		; <i32> [#uses=1]
	store i32 %tmp3, i32* %retval
	br label %return

return:		; preds = %entry
	%retval4 = load i32* %retval		; <i32> [#uses=1]
	ret i32 %retval4
}

define void @Handler1() {
entry:
	%e = alloca i32, align 4		; <i32*> [#uses=2]
	%f = alloca i32, align 4		; <i32*> [#uses=1]
	%ret = alloca i32, align 4		; <i32*> [#uses=1]
	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
	store i32 4, i32* %e
	%tmp = call i32 @common_func1( )		; <i32> [#uses=1]
	store i32 %tmp, i32* %f
	%tmp1 = load i32* %e		; <i32> [#uses=1]
	%tmp2 = call i32 @common_func2( i32 %tmp1 )		; <i32> [#uses=1]
	store i32 %tmp2, i32* %ret
	br label %return

return:		; preds = %entry
	ret void
}

define void @Handler2() {
entry:
	%ret = alloca i32, align 4		; <i32*> [#uses=1]
	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
	%tmp = call i32 @common_func1( )		; <i32> [#uses=1]
	%tmp1 = sub i32 %tmp, 7		; <i32> [#uses=1]
	%tmp2 = call i32 @common_func2( i32 %tmp1 )		; <i32> [#uses=1]
	store i32 %tmp2, i32* %ret
	br label %return

return:		; preds = %entry
	ret void
}

- when I now want to parse this file using the AsmParser via
llvm::ParseAssemblyFile my program crashes with the following error
message:

/usr/include/c++/4.1.2/debug/vector:192:error: attempt to subscript
    container with out-of-bounds index 0, but container only holds 0
    elements.

Objects involved in the operation:
sequence "this" @ 0x0xbf848814 {
  type = N15__gnu_debug_def6vectorIPN4llvm5ValueESaIS3_EEE;
}

when I try to use llvm-as to assemble the whole thing, I get the same
error message and a stack trace:

/usr/include/c++/4.1.2/debug/vector:192:error: attempt to subscript
    container with out-of-bounds index 0, but container only holds 0
    elements.

Objects involved in the operation:
sequence "this" @ 0x0xbfd32234 {
  type = N15__gnu_debug_def6vectorIPN4llvm5ValueESaIS3_EEE;
}
/home/scheler/llvm/install_debug/bin/llvm-as((anonymous
namespace)::PrintStackTrace()+0x1a)[0x83dbbba]
/home/scheler/llvm/install_debug/bin/llvm-as((anonymous
namespace)::SignalHandler(int)+0x112)[0x83dbe80]
[0xb7fda420]
/lib/libc.so.6(abort+0x101)[0xb7d5b801]
/usr/lib/libstdc++.so.6(__gnu_debug::_Error_formatter::_M_error()
const+0x1fe)[0xb7ed79ee]
/home/scheler/llvm/install_debug/bin/llvm-as(__gnu_debug_def::vector<llvm::Value*,
std::allocator<llvm::Value*> >::operator[](unsigned
int)+0xb4)[0x82a2698]
/home/scheler/llvm/install_debug/bin/llvm-as(llvmAsmparse()+0xd712)[0x8290bea]
/home/scheler/llvm/install_debug/bin/llvm-as[0x8292426]
/home/scheler/llvm/install_debug/bin/llvm-as(llvm::RunVMAsmParser(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&,
_IO_FILE*)+0x4a)[0x82928da]
/home/scheler/llvm/install_debug/bin/llvm-as(llvm::ParseAssemblyFile(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&,
llvm::ParseError*)+0xf3)[0x827f8c9]
/home/scheler/llvm/install_debug/bin/llvm-as(main+0x84)[0x8248656]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7d46f9c]
/home/scheler/llvm/install_debug/bin/llvm-as(__gxx_personality_v0+0x221)[0x8248211]


Am I missing something substantial? Is this a bug in the assembler
parser of the LLVM? Any help is appreciated!

Ciao, Fabian



More information about the llvm-dev mailing list