As GCC compiles file, Dehydra calls functions in the user analysis script with information about the code being compiled. For more information, see the function reference and the object reference.
Example: printing the location of type declarations
Save the following C++ code dumptypes.cc:
typedef int MyInt; struct Foo { int i; char *c; };
Save the following analysis script dumptypes.js:
function process_type(t) { print("Type found: " + t.name + " location: " + t.loc); } function input_end() { print("Hello, world!"); }
Compile using the following command:
$ g++ -fplugin=~/dehydra/gcc_dehydra.so -fplugin-arg=~/dumptypes.js -o/dev/null -c dumptypes.cc
Note:for g++4.5 and up
use -fplugin-arg-gcc_dehydra-script= rather than -fplugin-arg
It should print the following results:
Type found: Foo location: test.cc:2:12 Type found: MyInt location: test.cc:1:13 Hello, world!
See documentation for: process_type, input_end, print, .loc property
Example: using attributes to mark a class as "final"
Save the following code as final.cc:
// This class should not be subclassed! class __attribute__((user("final"))) MyClass { }; // This subclass should be an error class SubClass : public MyClass { };
Save the following analysis script final.js:
/** * Helper function: returns true if a class is marked with the "final" attribute. */ function isFinal(c) { if (!c.attributes) return false; for each (let a in c.attributes) if (a.name == 'user' && a.value == 'final') return true; return false; } function process_type(t) { if (t.bases) for each (let base in t.bases) if (isFinal(base.type)) error("class " + t.name + " extends final class " + base.type.name, t.loc); }
Compile using the following command:
$ g++ -fplugin=~/dehydra/gcc_dehydra.so -fplugin-arg=~/final.js -o/dev/null -c final.cc
It should print the following results and return with an error code:
final.cc:8: error: class SubClass extends final class MyClass
See documentation for: process_type, error, .bases property, .attributes property