This is an experiment to generate lightweight DWARF informations, that are stripped to only contains necessary information for doing FFI for C functions.
This is done through an LLVM pass that removes unnecessary information for DWARF representation that exists in the LLVM IR, after the optimisations are run on the IR.
This pass is based on LLVM 5.0.
To compile it:
$ mkdir build && cd build && cmake -DLLVM_CONFIG=/path/to/llvm-config -DCMAKE_BUILD_TYPE=release ..To use it:
$ /path/to/clang -Xclang -load -Xclang ./LightDwarf.so -O2 a.c -c -o a.oNote that you need optimisations for the pass to run!
These experiments need the ninja build system (https://ninja-build.org/).
$ mkdir /tmp/libarchive && ./libarchive.sh /tmp/libarchive /path/to/clang /path/to/LightDwarf.soOn my system (Debian Linux x64), this gives:
Original -rwxr-xr-x 1 aguinet aguinet 727K Mar 8 21:26 build_org/libarchive/libarchive.so.16 -rwxr-xr-x 1 aguinet aguinet 1.8M Mar 8 21:26 build_org/libarchive/libarchive.so.16.debug Light -rwxr-xr-x 1 aguinet aguinet 727K Mar 8 21:26 build_light/libarchive/libarchive.so.16 -rwxr-xr-x 1 aguinet aguinet 536K Mar 8 21:26 build_light/libarchive/libarchive.so.16.debug
where *.so files are stripped from debug informations, and *.debug files represent only the debug informations.
$ mkdir /tmp/zlib && ./zlib.sh /tmp/zlib /path/to/clang /path/to/LightDwarf.soOn my system (Debian Linux x64), this gives:
Original -rwxr-xr-x 1 aguinet aguinet 99K Mar 8 21:27 build_org/libz.so.1.2.11 -rwxr-xr-x 1 aguinet aguinet 161K Mar 8 21:27 build_org/libz.so.1.2.11.debug Light -rwxr-xr-x 1 aguinet aguinet 99K Mar 8 21:27 build_light/libz.so.1.2.11 -rwxr-xr-x 1 aguinet aguinet 61K Mar 8 21:27 build_light/libz.so.1.2.11.debug
where *.so files are stripped from debug informations, and *.debug files represent only the debug informations.