GitHub - eschulte/clang-mutate: Manipulate C-family ASTs with Clang
Manipulate C-family ASTs with Clang
This tool performs a number of operations on C-language source files.
ids | prints the total number of statements
number | numbers each statement
annotate | annotate each statement with its class
list | list every statement's id, class and range
cut | cuts that numbered statement
insert | copies the second numbered statement before the first
swap | swaps the two numbered statements
get | get the text of a stmt
set | set the text of a stmt
Installation
clang-mutate uses the clang LibTooling [1] interface. Thus the
clang-mutate executable works best when run from the same directory
as clang. Run "make install" to build and install.
On Arch Linux, aur scripts are provided in aur/ which may be used to
install both llvm/clang with header files and clang-mutate. Known
working versions are listed in the aur PKGBUILD files and in NOTES.
[1] http://clang.llvm.org/docs/LibTooling.html
Examples
$ cat etc/hello.c
#include <stdio.h>
int main(int argc, char *argv[])
{
puts("hello");
return 0;
}
$ clang-mutate -ids etc/hello.c --
Processing: hello.c.
9
$ clang-mutate -number etc/hello.c --
Processing: hello.c.
#include <stdio.h>
int main(int argc, char *argv[])
/* 0[ */{
/* 3[ *//* 2[ *//* 1[ */puts/* ]2 *//* ]3 */(/* 6[ *//* 5[ *//* 4[ */"hello"/* ]4 *//* ]5 *//* ]6 */);/* ]1 */
/* 7[ */return /* 8[ */0;/* ]7 *//* ]8 */
}/* ]0 */
$ clang-mutate -cut -stmt1=7 etc/hello.c --
Processing: hello.c.
#include <stdio.h>
int main(int argc, char *argv[])
{
puts("hello");
/* cut:7 */;
}
$ clang-mutate -set -stmt1=5 -value='"good bye"' etc/hello.c --
Processing: /home/eschulte/src/clang-mutate/hello.c.
#include <stdio.h>
int main(int argc, char *argv[])
{
puts("good bye");
return 0;
}
remove loop executions using the tools/perforate-loops script
$ make etc/loop
cc etc/loop.c -o etc/loop
$ ./etc/loop
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
$ ./tools/perforate-loops etc/loop.c > /tmp/faster.c
$ make /tmp/faster
cc /tmp/faster.c -o /tmp/faster
$ /tmp/faster
hello 0
hello 2
hello 4
hello 6
hello 8
replace string literals using tools/strings-to
$ ./tools/strings-to etc/hello.c foo
#include <stdio.h>
int main(int argc, char *argv[])
{
puts("foo");
return 0;
}