[llvm-dev] Versioning DWARF constants
David Blaikie via llvm-dev
llvm-dev at lists.llvm.org
Wed Mar 8 11:33:11 PST 2017
Seems pretty plausible to me.
On Wed, Mar 8, 2017 at 11:20 AM Robinson, Paul <paul.robinson at sony.com>
wrote:
> In https://reviews.llvm.org/D30664 Greg Clayton suggested adding a new
> version parameter to the macros that define DWARF constants (see
> include/Support/Dwarf.def). This would enable various things:
> - a "verify" mode to dwarfdump that could warn about using features that
> are newer than the stated version in a unit or other section;
> - a compiler assertion that guarded against using FORMs that are newer
> than the requested version;
> - if we ever supported -gstrict-dwarf, a compiler assertion that we do
> not emit any vendor extensions;
> - maybe other things.
>
> (Greg brought up "verify" mode, I am motivated by the FORM check.)
>
> It's easy enough (if tedious) to do the mechanical work to add a version
> to each constant, and some accessor functions to retrieve those values.
> The question is how to handle the vendor extensions.
>
> My thought was to define a fake version number for each "vendor" so we
> can easily identify them as nonstandard, and also identify which "vendor"
> defined a given extension. Looking through Dwarf.def, the vendors are:
> MIPS, GNU, Apple, Borland, Google, LLVM. DWARF does not define a "user"
> range for version numbers, but I should think it's safe enough to use
> values in the range 0xf0..0xff for this sort of thing.
>
> Class DwarfDebug already has a predicate to indicate it's okay to use
> Apple extensions, and tagging all Apple extensions with an Apple "version"
> would make it pretty trivial to add assertions in the emitter that this
> flag was obeyed. For example.
>
> I would want to add a predicate to DwarfDebug that looked like this:
>
> bool isValidFormForVersion(dwarf::Form Form) const {
> unsigned FormVersion = dwarf::FormVersion(Form);
> if (FormVersion <= getDwarfVersion())
> return FormVersion != 0;
> // The only extensions are GNU for split DWARF, pre-v5.
> return (FormVersion == DWARF_VERSION_GNU && useSplitDwarf() &&
> getDwarfVersion() <= 4);
> }
>
> Then DIEAbbrev::Emit() could have an assertion along the lines of:
> assert(AP->DD->isValidFormForVersion(Form) &&
> "Form not defined in this DWARF version");
>
> Does this all seem like a reasonable direction?
> Thanks,
> --paulr
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170308/0f5af6c5/attachment.html>
More information about the llvm-dev
mailing list