There are compiling errors when converting bytecode to c by LLC

I convert C to bytecode by LLVM, and then convert the bytecode back to C by LLC, but the generated C code cannot be compiled. Could anyone give me some suggestions? Thanks!

The initial C file is rather simple (hello world):

#include <stdio.h>

int main() {

printf(“hello world\n”);

printf(“hello world1\n”);

return 0;

}

The two commands:

llvm-gcc -emit-llvm -c -o hello.bc hello.c

llc -march=c hello.bc

Version of LLVM: 2.9

The source of error in generated c file:

/* Global Variable Declarations */

static _OC_str { unsigned char array[12]; };

static _OC_str1 { unsigned char array[13]; };

/* Global Variable Definitions and Initialization */

static _OC_str { unsigned char array[12]; } = { “hello world” };

static _OC_str1 { unsigned char array[13]; } = { “hello world1” };

It seems that _OC_str, and _OC_str1 are structure variables, but I have never seen such way of declarations, definitions, and initialization of structure in C code. I guess it may be supported in some standards of C. Could anyone please give me some information about the problem? Thanks!

Hi Fei Jia,

What revision are you using? I suggest you to try C backend with the
most recent LLVM version, if possible. I recall I had some similar C
backend breakages in July-August: structs definitions were lost
somewhere. To my understanding, the correct result should look like
this:

/* Typedefs */
typedef struct l_unnamed_0 l_unnamed_0;
typedef struct l_unnamed_1 l_unnamed_1;

/* Structure contents */
struct l_unnamed_0 {
  unsigned char array[12];
};

struct l_unnamed_1 {
  unsigned char array[13];
};

/* Global Variable Declarations */
static l_unnamed_0 _OC_cst;
static l_unnamed_1 _OC_cst1;

/* Global Variable Definitions and Initialization */
extern static l_unnamed_0 _OC_cst = { "hello world" };
extern static l_unnamed_1 _OC_cst1 = { "hello world1" };

- D.

Dear Dmitry,

Thanks for your reply. I have just updated my version from svn sever and it’s perfect now. The previous version is from the svn server several days before Oct 10, and I guess the code related with gcc might not be updated at that time.

Thanks a lot!