Skip to main content

A C/C++ code instrumenter used in DEAD

Project description

dead-instrument is the instrumenter used in DEAD.

To build just the clang tool

Prerequisites: cmake, make, clang/llvm 13/14.

mkdir build
cd build
cmake .. 
cmake --build . [--parallel]
cmake --install . --prefix=/where/to/install/

Usage

cat test.c
int foo(int a) {
    if (a == 0)
        return 1;
    else {
        a = 5;
    }

    return a;
}


dead-instrument test.c --


cat test.c
void DCEMarker0_(void);
void DCEMarker1_(void);
int foo(int a) {
  if (a == 0) {
    DCEMarker1_();
    return 1;
  } else {
    DCEMarker0_();
    a = 5;
  }

  return a;
}

It is also possible to emit macros used for disabling parts of the code that have found to be dead:

./dead-instrument --emit-disable-macros test.c --


cat test.c
void DCEMarker0_(void);
void DCEMarker1_(void);
int foo(int a) {
#if !defined(DeleteBlockDCEMarker0_) || !defined(DeleteBlockDCEMarker1_)
#if !defined(DeleteBlockDCEMarker0_) && !defined(DeleteBlockDCEMarker1_)
    if (
#endif
        a == 0
#if !defined(DeleteBlockDCEMarker0_) && !defined(DeleteBlockDCEMarker1_)
    )
#else
        ;
#endif
#ifndef DeleteBlockDCEMarker1_
    {

        DCEMarker1_();
        return 1;
    }
#endif
#if !defined(DeleteBlockDCEMarker0_) && !defined(DeleteBlockDCEMarker1_)
    else

#endif

#ifndef DeleteBlockDCEMarker0_
    {
        DCEMarker0_();
        a = 5;
    }
#endif
#endif
    return a;
}


gcc -E -P -DDeleteBlockDCEMarker0_ test.c  | clang-format                                                                      disabled_dead_code_macros_squashed
void DCEMarker0_(void);
void DCEMarker1_(void);
int foo(int a) {
  a == 0;
  {
    DCEMarker1_();
    return 1;
  }
  return a;
}

Python wrapper

pip install dead-instrumenter

To use the instrumenter in python import from dead_instrumenter.instrumenter import instrument_program: instrument_program(program: diopter.SourceProgram) -> InstrumentedProgram.

Building the python wrapper

Local build
./build_python_wheel_local.sh #this will build the current branch
pip install .

Docker based build

docker run --rm -e REVISION=REV -v `pwd`:/io theodort/manylinux-with-llvm:latest /io/build_python_wheel_docker.sh

This will build multiple wheels for REV with multiple python versions. The output is stored in the wheelhouse directory. The docker image is based on https://github.com/thetheodor/manylinux-with-llvm.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

dead_instrumenter-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (16.8 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

dead_instrumenter-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (16.8 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page