Proposal: global symbol offsets

Hi,

I'd like to propose that we introduce a mechanism in LLVM for
declaring that the symbol for a given global variable should be
assembled at a given offset from the start of the data for that global.
The main reason for doing this would be to allow a module to conform to
an externally imposed ABI which requires data to be present below
a symbol. We have two specific use cases in mind at the moment:

1) The Microsoft C++ ABI, whose vtable symbols point to the first
   virtual function. The pointer to the RTTI data for the symbol
   resides at one pointer width below the first virtual function pointer.

2) Allowing memory safety tools such as Address Sanitizer to emit a redzone
   before each global variable while allowing the external symbols to be
   used by uninstrumented code.

Below I've listed five design alternatives I considered with their pros
and cons: