Moves the bindings to ASAN, MSAN, TSAN, and DFSAN out of the Go bindings and into the C bindings.
Additionally, add bindings to Code Coverage Sanitizer.
The notable addition to the API is the options wrappers. Memory Sanitizer, and Code Coverage Sanitizer offer structures that encapsulate their configuration options. As these structures are subject to change in future releases of LLVM, the bindings have corresponding opaque wrapper structs that have explicit allocation/destruction routines. This way, we can support future added options by adding bindings that act as setters. We support future removed options by marking their corresponding parameter dead in the documentation/deprecating the setter wrapper.
I think enormous parameter lists are a very error-prone way to do this kind of binding. What about making a C structure reflecting the currently recognized options, and passing the length of this structure to the LLVMCreate*Options functions? This is similar to what WinAPI is doing.
I.e.
So, we could deprecate options by making them dead (and hopefully there's some attribute we can use to cause a warning to be emitted on access), and add new ones by appending them towards the end of the structure. For C/C++ users of the C API as well as any autogenerated bindings, the upgrades are now completely transparent. For non-autogenerated bindings, it's still less work to add new options.
@echristo @deadalnix What do you think?