I’ve been working on adding support for Linux on SystemZ as a target (and host) platform for LLDB, and now have a patch set ready that I’d like to submit for upstream inclusion.
For reference, I’ve attached the patch set as a quilt stack.
(See attached file: patches-lldb-s390x.tar.bz2)
I’d be happy to split it out into one email per patch or use Phabricator, whatever you prefer. I’d also appreciate suggestions for potential reviewers I could list on Phabricator revisions for each of the affected areas. This is my first contribution to LLDB, and I’m not really familiar with the community yet.
There’s a number of separate changes implemented by the patch set. First of all, I ran into three problems that seem to be platform-independent, but are related to version and implementation details of the linker and libc library in use on the system, which is why they may not show up everywhere (but they certainly caused many test case failures on my system). These are:
- LLDB was unable to find the .plt section and therefore did not identify PLT call stubs (see diff-pltsection)
- LLDB would sometimes not find DWARF CFI entries if the PC points one beyond the end of a function (see diff-tailcall)
- LLDB would fail expression evaluation if clang asks for an identifier that exists both as type name and variable name (see diff-typelookup)
Next, I had to add one new member routine to the ABI class. This was necessary since on SystemZ, the CFA does not equal the incoming stack pointer value (like LLDB unwind code assumes), but instead is offset by a constant, i.e. CFA = incoming SP + 160. The new ABI member CFAOffset allows a platform to provide this offset of the CFA relative to the SP to common unwind code (see diff-cfaoffset).
The patch diff-s390x then adds all the new back-end code to support Linux on SystemZ. Its only strict pre-requisite is diff-cfaoffset. Changes includes in this patch are:
- A new ArchSpec value of eCore_s390x_generic
- A new directory Plugins/ABI/SysV-s390x providing an ABI implementation
- Register context support
- Native Linux support including watchpoint support
- ELF core file support
- Misc. support throughout the code base (e.g. breakpoint opcodes)
- Test case updates to support the platform
This should provide complete support for debugging the base SystemZ platform. Not yet supported are optional features like transaction support (zEC12) or SIMD vector support (z13). Note that there is no instruction emulation, since our ABI requires that all code provides correct DWARF CFI in .eh_frame to support unwinding.
However, after that there are still many failing test cases due to various bugs in common code. The patch diff-signedchar fixes a number of problems caused by LLDB assuming a plain “char” type is signed; this is actually platform-specific, and on SystemZ, char is in fact unsigned.
The remaining patches fix many problems throughout the code base affecting big-endian platforms (like SystemZ). The biggest problem was that pretty much every access to APInt.getRawData (mostly via the Scalar class, but in a couple of other places as well) was incorrect on big-endian systems. This is fixed in diff-endian-scalar, which requires diff-getbytes-const as pre-requisite, a patch that changes RegisterValue so as to allow Scalar.getBytes to be made const. Other endian related issues were:
- Bit field numbering didn’t work correctly (see diff-endian-bitfield)
- Some smaller miscellaneous issues (see diff-endian-misc)
- ARM instruction emulation tests wouldn’t work on big-endian host systems (see diff-endian-armemu)
- Misc. test cases made byte order assumptions (see diff-endian-tests)
With the full patch stack applied on a current LLDB code base (rev. 265656), I’m getting a clean test suite run on the platform:
patches-lldb-s390x.tar.bz2 (37.8 KB)