On 9/29/20 11:22 AM, John Paul Adrian Glaubitz wrote:
I'm looking for an information regarding exception handling on Linux/m68k, in particular
I need to know what registers are used by the ABI in order to implement the functions
"getExceptionPointerRegister" and "getExceptionSelectorRegister" in the M680x0 backend
in LLVM [1], [2].
I don;t know what those functions are, but from their names they seem to be related to figuring out the exception object and type?
Do you understand the itanium ABI's unwinding mechanism --
1) follow stack to get to landing pad.
2) invoke landing pad to see if it wants to catch
3) if not, continue following stack
4) once we've found one to catch it, we need to unwind properly, which involves invoking cleanups. and eventually getting to the catcher
invoking the landing pad means passing (a) an integer telling it what's happening, and (b) a pointer to data.
I looked into the GCC source code to find the corresponding parts but I could only find
the macros prefixed with "EH_" [4] which I didn't fully understand.
Those are the bits you want. one of those is the selector (0?) and the other is the data pointer (1?).
do you know what those 2 functions you mention provide on say x86? Then it might be easier to map onto 68k.
From [1]:
[1] https://raw.githubusercontent.com/llvm/llvm-project/master/llvm/lib/Target/X86/X86ISelLowering.cpp
Hi Nathan!
On 9/29/20 7:58 PM, Nathan Sidwell wrote:
On 9/29/20 11:22 AM, John Paul Adrian Glaubitz wrote:
I'm looking for an information regarding exception handling on Linux/m68k, in particular
I need to know what registers are used by the ABI in order to implement the functions
"getExceptionPointerRegister" and "getExceptionSelectorRegister" in the M680x0 backend
in LLVM [1], [2].
I don;t know what those functions are, but from their names they seem to be related to figuring out the exception object and type?
I think so. I'm not a compiler expert hence my questions :-).
Do you understand the itanium ABI's unwinding mechanism --
1) follow stack to get to landing pad.
2) invoke landing pad to see if it wants to catch
3) if not, continue following stack
4) once we've found one to catch it, we need to unwind properly, which involves invoking cleanups. and eventually getting to the catcher
invoking the landing pad means passing (a) an integer telling it what's happening, and (b) a pointer to data.
This seems to be the data that I need. I just need to understand how that works.
I looked into the GCC source code to find the corresponding parts but I could only find
the macros prefixed with "EH_" [4] which I didn't fully understand.
Those are the bits you want. one of those is the selector (0?) and the other is the data pointer (1?).
OK. But aren't they passed through particular registers on m68k? Or is this something specific
to LLVM?
Aha! it is EH_RETURN :) and it appears stack adjustment is something different.
for x86, gcc has:
#define EH_RETURN_DATA_REGNO(N) ((N) <= DX_REG ? (N) : INVALID_REGNUM)
thus N can either be AX_REG or DX_REG. (which is eax/rax and edx/rdx depending on compilation mode)
for m68k gcc has:
#define EH_RETURN_DATA_REGNO(N) \
((N) < 2 ? (N) : INVALID_REGNUM)
so that's registers d0 and d1
I'm guessing EHPersonality:CoreCLR is a different ABI that you're not concerned with.
Thus I think you want:
getExceptionPointerRegister to return d0 and getExceptionSelectorRegister to return d1.
give that a go, and see if you can throw/catch exceptions between code compiled by your llvm port and a gcc
hope that helps.I'll give it a try.
Hi Nathan!
Thanks for the explanations!
On 10/1/20 2:27 PM, Nathan Sidwell wrote:
do you know what those 2 functions you mention provide on say x86? Then it might be easier to map onto 68k.
From [1]:
Register X86TargetLowering::getExceptionPointerRegister(
const Constant *PersonalityFn) const {
if (classifyEHPersonality(PersonalityFn) == EHPersonality::CoreCLR)
return Subtarget.isTarget64BitLP64() ? X86::RDX : X86::EDX;
return Subtarget.isTarget64BitLP64() ? X86::RAX : X86::EAX;
}
Register X86TargetLowering::getExceptionSelectorRegister(
const Constant *PersonalityFn) const {
// Funclet personalities don't use selectors (the runtime does the selection).
assert(!isFuncletEHPersonality(classifyEHPersonality(PersonalityFn)));
return Subtarget.isTarget64BitLP64() ? X86::RDX : X86::EDX;
}
Adrian
[1] https://raw.githubusercontent.com/llvm/llvm-project/master/llvm/lib/Target/X86/X86ISelLowering.cpp
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 296 |
Nodes: | 16 (2 / 14) |
Uptime: | 36:42:31 |
Calls: | 6,648 |
Calls today: | 3 |
Files: | 12,193 |
Messages: | 5,329,124 |