JuliaHubOSS / llvm-cbe

resurrected LLVM "C Backend", with improvements
Other
832 stars 141 forks source link

BUG: wrong compilation #52

Closed BrassT closed 4 years ago

BrassT commented 5 years ago

Hi, I had bug after translating code. my C code. File "test.c":

struct A{
    int arr[1];
};
void test_fn(struct A * p){
    p->arr[0] = ((struct A *)9)->arr[0];
}

It is translated by LLVM-CBE:

struct l_array_1_uint32_t {
  uint32_t array[1];
};
struct l_struct_struct_OC_A {
  struct l_array_1_uint32_t field0;
};
void test_fn(struct l_struct_struct_OC_A* llvm_cbe_tmp__1) {
  struct l_struct_struct_OC_A* llvm_cbe_tmp__2;    /* Address-exposed local */
  uint32_t llvm_cbe_tmp__3;
  struct l_struct_struct_OC_A* llvm_cbe_tmp__4;

  llvm_cbe_tmp__2 = llvm_cbe_tmp__1;
  llvm_cbe_tmp__3 = *((&((struct l_struct_struct_OC_A*)(uintptr_t)UINT64_C(9))->field0[((int64_t)UINT64_C(0))]));
  llvm_cbe_tmp__4 = llvm_cbe_tmp__2;
  *((&(*((&llvm_cbe_tmp__4->field0))).array[((int64_t)UINT64_C(0))])) = llvm_cbe_tmp__3;
}

` And Then compile error:

$ clang -S -emit-llvm test.c && llvm-cbe test.ll && clang -c test.cbe.c test.cbe.c:53:87: error: subscripted value is not an array, pointer, or vector var_name_tmp__3 = ((&((struct l_struct_struct_OC_A)(uintptr_t)UINT64_C(9))->field0[((int64_t)UINT64_C(0))]));

I think that generating code should be : var_name_tmp__3 = *((&((struct l_struct_struct_OC_A*)(uintptr_t)UINT64_C(9))->field0.array[((int64_t)UINT64_C(0))]));

And this code has tested. It's ok. I guess LLVM-CBE misses the operation ".array" for the test case

BrassT commented 4 years ago

Thanks!