[COFF] Clean up boolean flag handling
authorShoaib Meenai <smeenai@fb.com>
Tue, 24 Oct 2017 21:17:16 +0000 (21:17 +0000)
committerShoaib Meenai <smeenai@fb.com>
Tue, 24 Oct 2017 21:17:16 +0000 (21:17 +0000)
commit59bf36297498ec7892478d88aac1f454546b852c
treef8f49a5d089a04cbfb1d1a21b8dcf922919269d2
parent7ade0173df8fe6aaab5b5fe2fe39fb1fdc7dffc7
[COFF] Clean up boolean flag handling

LLD's handling of boolean flags is suboptimal:
* All boolean flags have a corresponding `:no` flag to turn the flag
  off, and the linker should scan for both the non-suffixed and suffixed
  flags (and the last one should win), but right now it only scans for
  either the suffixed or non-suffixed flag (depending on the default
  flag value).
* The `B` multiclass only allows specifying help text for the suffixed
  (`:no`) flag, but for some flags (e.g. `/appcontainer`) the help text
  should be associated with the non-suffixed flag instead.

Extend the `B` multiclass to have help text for both non-suffixed and
suffixed flag variants, and alter the existing help text accordingly in
some cases. Scan for both the non-suffixed and suffixed variants in the
driver and set config values accordingly.

This should mostly have no behavior change, apart from the added help
text and the modified argument scanning. Some flags are handled slightly
differently now, however; for example, LLD would previously always treat
64-bit images as large address aware, whereas `/largeaddressaware:no` is
now respected for 64-bit images (which is also how link.exe behaves).

Differential Revision: https://reviews.llvm.org/D39216

llvm-svn: 316501
lld/COFF/Driver.cpp
lld/COFF/Options.td