Win32 COFF Support

Hi guys,

While trying to get dwarf debugging information to work with Win32 COFF targets, I came across a couple of issues with the current implementation of WinCOFFObjectWriter. Emitting empty section causes debug information to invalid, as the presence of certain debug section implies available information, and emission of labels as symbols confused gdb about the structure of the program.

The attached patch allows the WinCOFFObjectWriter to drop empty sections, and label symbols. It converts relocations targeted at symbols into relocations relative to the containing section.

I have not run the tests in the ‘/test/MC/COFF’, but have run through the unit-test framework for my compiler and generated some text executables with clang and everything looks to be in order. It may change the output of the ‘/test/MC/COFF’ if the string references are emitted as temporaries.


wincoff.patch (15.7 KB)

The patch looks good, but please follow the LLVM coding conventions.
Also, clang emits warnings on all of the signed-unsigned comparisons,
and the order of initialization for COFFSymbol::MCData.

The test fails, but that's only because it is looking for binary
equivalence, just llc the test and run coff-dump to re update it. I
ran the test-suite with clang -integrated-as with and without your
patch and I got identical results.

So fix the coding conventions, warnings, and update the tests and it's
good. I don't mind doing this if you would prefer.

- Michael Spencer

If you don’t mind then please make the appropriate changes. Thanks.


Committed in r114823.

- Michael Spencer


It seems that there actually is a bug. I thought it was due to
something else, but reverting this patch fixes it. Why/when exactly
does gdb expect IMAGE_SYM_CLASS_LABEL?

- Michael Spencer

I've attached a patch that fixes the above problem while keeping the
LABEL storage class on labels. Can you verify that it keeps the
behavior you wanted?

- Michael Spencer

coff-fix-symbol-storage-class.patch (1.49 KB)

That was a mistake on my part. I was trying to figure out why gdb was showing each label as its own function. I tried the label storage class and forgot to revert it. The real fix was not to put temporary symbols into the COFF symbol table. The assignment of the storage class to label in the emit label method is unneeded.

  • Nathan