diff options
author | Sverker Eriksson <[email protected]> | 2014-04-25 23:02:26 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2014-04-29 16:17:56 +0200 |
commit | c4cdb1847e09d1153a6044d7a6aac05db4fad515 (patch) | |
tree | 6bbb66be7b53e2532caee29ee0ff455416e9b2af /erts/emulator/hipe/hipe_sparc.c | |
parent | 23246d73bbd3188e2c0a45408b9bd29fd034ccaf (diff) | |
download | otp-c4cdb1847e09d1153a6044d7a6aac05db4fad515.tar.gz otp-c4cdb1847e09d1153a6044d7a6aac05db4fad515.tar.bz2 otp-c4cdb1847e09d1153a6044d7a6aac05db4fad515.zip |
erts: Fix global tracing of beam function when called from hipe code
Make hipe to beam calls use export entry.
Makes it a lot easier to handle global tracing correctly
(breakpoints in export entry). A beam function should now be traced
correctly regardless how it is called.
This will also fix a SEGV crash when a hipe stub is made pointing into
a traced export entry and tracing is then stopped which clears the export
entry causing the hipe stub to execute beam instruction NULL.
This commit assumes that hipe code never calls local beam functions, which
should be the case nowadays as we only hipe compile entire modules.
Diffstat (limited to 'erts/emulator/hipe/hipe_sparc.c')
-rw-r--r-- | erts/emulator/hipe/hipe_sparc.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/erts/emulator/hipe/hipe_sparc.c b/erts/emulator/hipe/hipe_sparc.c index 49d4da7bab..2052aa8498 100644 --- a/erts/emulator/hipe/hipe_sparc.c +++ b/erts/emulator/hipe/hipe_sparc.c @@ -204,9 +204,7 @@ void *hipe_alloc_code(Uint nrbytes, Eterm callees, Eterm *trampolines, Process * return alloc_code(nrbytes); } -/* called from hipe_bif0.c:hipe_bifs_make_native_stub_2() - and hipe_bif0.c:hipe_make_stub() */ -void *hipe_make_native_stub(void *beamAddress, unsigned int beamArity) +void *hipe_make_native_stub(void *callee_exp, unsigned int beamArity) { unsigned int *code; unsigned int callEmuOffset; @@ -215,11 +213,11 @@ void *hipe_make_native_stub(void *beamAddress, unsigned int beamArity) code = alloc_code(5*sizeof(int)); /* sethi %hi(Address), %i4 */ - code[0] = 0x39000000 | (((unsigned int)beamAddress >> 10) & 0x3FFFFF); + code[0] = 0x39000000 | (((unsigned int)callee_exp >> 10) & 0x3FFFFF); /* or %g0, %o7, %i3 ! mov %o7, %i3 */ code[1] = 0xB610000F; /* or %i4, %lo(Address), %i4 */ - code[2] = 0xB8172000 | ((unsigned int)beamAddress & 0x3FF); + code[2] = 0xB8172000 | ((unsigned int)callee_exp & 0x3FF); /* call callemu */ callEmuOffset = (char*)nbif_callemu - (char*)&code[3]; code[3] = (1 << 30) | ((callEmuOffset >> 2) & 0x3FFFFFFF); |