Commit 464f0373 authored by rje's avatar rje
Browse files

[project @ 2002-01-26 17:58:47 by rje]

This is a simple fix for a rather obscure bug.

In the heap/stack checking code, we were creating info tables with names of the form stg_gc_X_ret_info, and giving them entry points with names of the form stg_gc_X_ret.

Unfortunately, the mangler expects that if an info table is called Y_info, the entry point should be called Y_ret or Y_entry.

In this case, the mangler thus looks for stg_gc_X_ret_ret and stg_gc_X_ret_entry, neither of which exists.

As a result, the entry points aren't placed directly after the info tables.

Fortunately, the code for the entry points was defined emmediately after the info table definition, and so was *usually* in the right place already.


However, in certain circumstances (that can result from some tweaks on my private tree, and might possibly occur by other means), this was not happening, and thus any attempts to enter the entry point for this info table will cause problems.


The fix is quite simple: rename the info tables so that the mangler finds the entry points and puts them in the right places.


I don't think this commit is likely to have a notable effect on anything else.
parent cfe26441
/* -----------------------------------------------------------------------------
* $Id: HeapStackCheck.hc,v 1.20 2001/12/10 17:55:40 sewardj Exp $
* $Id: HeapStackCheck.hc,v 1.21 2002/01/26 17:58:47 rje Exp $
*
* (c) The GHC Team, 1998-1999
*
......@@ -640,7 +640,7 @@ EXTFUN(stg_gc_seq_1)
* return address from the stack, we can get rid of this little
* function/info table...
*/
INFO_TABLE_SRT_BITMAP(stg_gc_noregs_ret_info, stg_gc_noregs_ret, 0/*BITMAP*/,
INFO_TABLE_SRT_BITMAP(stg_gc_noregs_info, stg_gc_noregs_ret, 0/*BITMAP*/,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
......@@ -655,14 +655,14 @@ EXTFUN(stg_gc_noregs)
{
FB_
Sp -= 1;
Sp[0] = (W_)&stg_gc_noregs_ret_info;
Sp[0] = (W_)&stg_gc_noregs_info;
GC_GENERIC
FE_
}
/*-- R1 is boxed/unpointed -------------------------------------------------- */
INFO_TABLE_SRT_BITMAP(stg_gc_unpt_r1_ret_info, stg_gc_unpt_r1_ret, 0/*BITMAP*/,
INFO_TABLE_SRT_BITMAP(stg_gc_unpt_r1_info, stg_gc_unpt_r1_ret, 0/*BITMAP*/,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
......@@ -680,14 +680,14 @@ EXTFUN(stg_gc_unpt_r1)
FB_
Sp -= 2;
Sp[1] = R1.w;
Sp[0] = (W_)&stg_gc_unpt_r1_ret_info;
Sp[0] = (W_)&stg_gc_unpt_r1_info;
GC_GENERIC
FE_
}
/*-- R1 is unboxed -------------------------------------------------- */
INFO_TABLE_SRT_BITMAP(stg_gc_unbx_r1_ret_info, stg_gc_unbx_r1_ret, 1/*BITMAP*/,
INFO_TABLE_SRT_BITMAP(stg_gc_unbx_r1_info, stg_gc_unbx_r1_ret, 1/*BITMAP*/,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
/* the 1 is a bitmap - i.e. 1 non-pointer word on the stack. */
......@@ -713,7 +713,7 @@ EXTFUN(stg_gc_unbx_r1)
/*-- F1 contains a float ------------------------------------------------- */
INFO_TABLE_SRT_BITMAP(stg_gc_f1_ret_info, stg_gc_f1_ret, 1/*BITMAP*/,
INFO_TABLE_SRT_BITMAP(stg_gc_f1_info, stg_gc_f1_ret, 1/*BITMAP*/,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
......@@ -731,7 +731,7 @@ EXTFUN(stg_gc_f1)
FB_
Sp -= 2;
ASSIGN_FLT(Sp+1, F1);
Sp[0] = (W_)&stg_gc_f1_ret_info;
Sp[0] = (W_)&stg_gc_f1_info;
GC_GENERIC
FE_
}
......@@ -746,7 +746,7 @@ EXTFUN(stg_gc_f1)
# define DBL_BITMAP 3
#endif
INFO_TABLE_SRT_BITMAP(stg_gc_d1_ret_info, stg_gc_d1_ret, DBL_BITMAP,
INFO_TABLE_SRT_BITMAP(stg_gc_d1_info, stg_gc_d1_ret, DBL_BITMAP,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
......@@ -764,11 +764,12 @@ EXTFUN(stg_gc_d1)
FB_
Sp -= 1 + sizeofW(StgDouble);
ASSIGN_DBL(Sp+1,D1);
Sp[0] = (W_)&stg_gc_d1_ret_info;
Sp[0] = (W_)&stg_gc_d1_info;
GC_GENERIC
FE_
}
/*-- L1 contains an int64 ------------------------------------------------- */
/* we support int64s of either 1 or 2 words in size */
......@@ -779,7 +780,7 @@ EXTFUN(stg_gc_d1)
# define LLI_BITMAP 3
#endif
INFO_TABLE_SRT_BITMAP(stg_gc_l1_ret_info, stg_gc_l1_ret, LLI_BITMAP,
INFO_TABLE_SRT_BITMAP(stg_gc_l1_info, stg_gc_l1_ret, LLI_BITMAP,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
......@@ -797,7 +798,7 @@ EXTFUN(stg_gc_l1)
FB_
Sp -= 1 + sizeofW(StgWord64);
ASSIGN_Int64(Sp+1,L1);
Sp[0] = (W_)&stg_gc_l1_ret_info;
Sp[0] = (W_)&stg_gc_l1_info;
GC_GENERIC
FE_
}
......@@ -832,7 +833,7 @@ EXTFUN(stg_gc_l1)
/*---- R1 contains a pointer: ------ */
INFO_TABLE_SRT_BITMAP(stg_gc_ut_1_0_ret_info, stg_gc_ut_1_0_ret, 1/*BITMAP*/,
INFO_TABLE_SRT_BITMAP(stg_gc_ut_1_0_info, stg_gc_ut_1_0_ret, 1/*BITMAP*/,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
......@@ -851,14 +852,14 @@ EXTFUN(stg_gc_ut_1_0)
Sp -= 3;
Sp[2] = R1.w;
Sp[1] = R2.w;
Sp[0] = (W_)&stg_gc_ut_1_0_ret_info;
Sp[0] = (W_)&stg_gc_ut_1_0_info;
GC_GENERIC
FE_
}
/*---- R1 contains a non-pointer: ------ */
INFO_TABLE_SRT_BITMAP(stg_gc_ut_0_1_ret_info, stg_gc_ut_0_1_ret, 3/*BITMAP*/,
INFO_TABLE_SRT_BITMAP(stg_gc_ut_0_1_info, stg_gc_ut_0_1_ret, 3/*BITMAP*/,
0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, EF_, 0, 0);
......@@ -875,7 +876,7 @@ EXTFUN(stg_gc_ut_0_1)
{
FB_
Sp -= 3;
Sp[0] = (W_)&stg_gc_ut_0_1_ret_info;
Sp[0] = (W_)&stg_gc_ut_0_1_info;
Sp[1] = R2.w;
Sp[2] = R1.w;
GC_GENERIC
......@@ -1205,7 +1206,7 @@ FN_(stg_yield_noregs)
{
FB_
Sp--;
Sp[0] = (W_)&stg_gc_noregs_ret_info;
Sp[0] = (W_)&stg_gc_noregs_info;
YIELD_GENERIC;
FE_
}
......@@ -1234,7 +1235,7 @@ FN_(stg_block_noregs)
{
FB_
Sp--;
Sp[0] = (W_)&stg_gc_noregs_ret_info;
Sp[0] = (W_)&stg_gc_noregs_info;
BLOCK_GENERIC;
FE_
}
......@@ -1268,7 +1269,7 @@ FN_(stg_block_1)
*
* -------------------------------------------------------------------------- */
INFO_TABLE_SRT_BITMAP(stg_block_takemvar_ret_info, stg_block_takemvar_ret,
INFO_TABLE_SRT_BITMAP(stg_block_takemvar_info, stg_block_takemvar_ret,
0/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, IF_, 0, 0);
......@@ -1291,7 +1292,7 @@ FN_(stg_block_takemvar)
FE_
}
INFO_TABLE_SRT_BITMAP(stg_block_putmvar_ret_info, stg_block_putmvar_ret,
INFO_TABLE_SRT_BITMAP(stg_block_putmvar_info, stg_block_putmvar_ret,
0/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/,
RET_SMALL,, IF_, 0, 0);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment