ARM Debug support patch

Hi all,

FlexyCore, the company I am working for, use LLVM to generate binary for ARM
platform. We are very fulfilled with LLVM, and FlexyCore will be pleased to
contribute on this software.

We need debug support in ARM binary, but, in LLVM 2.4, this support is not
activated for ARM backend. Consequently, I made small modifications in order
to activate it (see the patch in attach file). My experience is not enough
on LLVM to know if it is the right way to solve the problem. But these
modifications work on our use cases.

Could you help us in order to check if these modifications are corrects or
not ? If it is not the right way, could you explain us how to solve this
problem in the correct way, and we will be pleased to re-submit patch on
this issue.

I also use 'make check' command in order to verify that modifications does
not generate regressions.
Results are:

    * Without ARM debug support
      === Summary ===
      # of expected passes 2726
      # of unexpected failures 58
      # of expected failures 6
    * With ARM debug support
      === Summary ===
      # of expected passes 2727
      # of unexpected failures 57
      # of expected failures 6

The extra success test is funccall.ll from test/DebugInfo. In order to build
successfully LLVM on ARM Linux EABI platform, I put in comment the usage of
__register_frame into JIT.cpp because it seems that __register_frame
function is not into my libgcc. Could you mention which tools and versions
that must to be used in order to build LLVM on ARM Linux EABI platform.

Thanks,

Mikaël.

http://www.nabble.com/file/p20938563/arm-debug-from-llvm2-4.patch
arm-debug-from-llvm2-4.patch

Hello, Mikaël

We need debug support in ARM binary, but, in LLVM 2.4, this support is not
activated for ARM backend. Consequently, I made small modifications in order
to activate it (see the patch in attach file). My experience is not enough
on LLVM to know if it is the right way to solve the problem. But these
modifications work on our use cases.

asmprinter part looks ok for me. I'll let others comment on DAG part.

The extra success test is funccall.ll from test/DebugInfo. In order to build
successfully LLVM on ARM Linux EABI platform, I put in comment the usage of
__register_frame into JIT.cpp because it seems that __register_frame
function is not into my libgcc.

How dwarf frames are registered there then?

Hi Mikaël,

Thanks for the patch. Some comments:

1. Please don't use tabs.
2.
Index: lib/Target/ARM/ARMInstrInfo.cpp

Another problem:

+ if (isa<GlobalValue>(cpool->getConstVal())) {
+ GlobalValue *GV = cast<GlobalValue>(cpool- >getConstVal());

This only works in static relocation mode. I'll fix this.

Evan

I've committed the patch with some fixes. It allows ARM target to generate Dwarf information. However, I did not have much luck debugging llvm produced executables. I would appreciate it very much if you can put the debug support to test and contribute more patches.

Thanks,

Evan

Hi, Evan

I've committed the patch with some fixes. It allows ARM target to
generate Dwarf information. However, I did not have much luck
debugging llvm produced executables. I would appreciate it very much
if you can put the debug support to test and contribute more patches.

Maybe encoding is somehow different for arm/linux and arm/darwin?

Thanks for the commit.

FlexyCore works only on ARM EABI Linux target for now. This binary with
Dwarf information could be debugged with a gdb-server 6.8 without problem on
our side.

If you are working on ARM Linux target, could you send us LLVM source file,
and gdb version ? But if you are using ARM Darwin as Anton suggest, we are
unable to test this for now.

We are open to help on this target, but we need some help to efficiently
setup the right Darwin platform (pre-compile binary platform, qemu, boards
???).

Do not hesitate to contact us directly by mail on this topic.

Thanks,

Mike.

Evan Cheng wrote:

Hi, Evan

I've committed the patch with some fixes. It allows ARM target to
generate Dwarf information. However, I did not have much luck
debugging llvm produced executables. I would appreciate it very much
if you can put the debug support to test and contribute more patches.

Maybe encoding is somehow different for arm/linux and arm/darwin?

That's likely one of the reasons. There are probably some other issues.

Evan

Thanks for the commit.

FlexyCore works only on ARM EABI Linux target for now. This binary with
Dwarf information could be debugged with a gdb-server 6.8 without problem on
our side.

Good to hear. Are you able to examine aggregates?

If you are working on ARM Linux target, could you send us LLVM source file,
and gdb version ? But if you are using ARM Darwin as Anton suggest, we are
unable to test this for now.

We are open to help on this target, but we need some help to efficiently
setup the right Darwin platform (pre-compile binary platform, qemu, boards
???).

I am not sure how to build llvm-gcc with Mac OS X / arm support using the open sourced llvm-gcc tree. It would be nice if someone can figure that out and post instructions. I would very like to see qemu support as well. I know Greg is also interested in this. Greg, any ideas?

Do not hesitate to contact us directly by mail on this topic.

Thanks,

Evan

Hi Evans,

Currently, we have not test all debug functionnalities, this will be done
with the progress of our project.
Could you explain more in details (by mail if possible) what is the problem
with aggregates and debugging ?
Could you also provide C program or llvm source file that exposes this
problem in order to see what we can do?

During our roadmap progress, FlexyCore will not hesitate to send patches if
needed.

Mikaël.

Evan Cheng wrote:

Hi Evans,

Currently, we have not test all debug functionnalities, this will be done
with the progress of our project.
Could you explain more in details (by mail if possible) what is the problem
with aggregates and debugging ?
Could you also provide C program or llvm source file that exposes this
problem in order to see what we can do?

Try something simple like this:

#include <vector>
#include <iostream>
#include <queue>

int main() {
   std::priority_queue<int> q;
   int nums[10] = { 10, 6, 8, 3, 5, 1, 2, 7, 9, 4 };
   for (int i = 0; i < 10; ++i)
     q.push(nums[i]);
   while (!q.empty()) {
     std::cout << q.top() << " ";
     q.pop();
   }
   std::cout << '\n';
   return 0;
}

I can't examine nums[0] etc. under gdb. It doesn't even know nums is not a scalar.

During our roadmap progress, FlexyCore will not hesitate to send patches if
needed.

Great. Thanks!

Evan