70 lines
1.8 KiB
C
70 lines
1.8 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2012 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include <rtnhdr.h>
|
|
#include "urx.h"
|
|
|
|
GBLDEF urx_rtnref urx_anchor;
|
|
|
|
void urx_resolve(rhdtyp *rtn, lab_tabent *lbl_tab, lab_tabent *lbl_top)
|
|
{
|
|
urx_rtnref *rp0, *rp1;
|
|
urx_labref *lp0, *lp1;
|
|
urx_addr *ap;
|
|
|
|
if (!urx_getrtn(rtn->routine_name.addr, rtn->routine_name.len, &rp0, &rp1, &urx_anchor))
|
|
return;
|
|
while ((ap = rp1->addr) != 0)
|
|
{
|
|
assert(0 == *ap->addr);
|
|
#ifdef VMS
|
|
*ap->addr = (int4)rtn->linkage_ptr;
|
|
#else
|
|
*ap->addr = (UINTPTR_T)rtn;
|
|
#endif
|
|
rp1->addr = ap->next;
|
|
free(ap);
|
|
}
|
|
while (lbl_tab < lbl_top)
|
|
{
|
|
if (urx_getlab(lbl_tab->lab_name.addr, lbl_tab->lab_name.len, rp1, &lp0, &lp1))
|
|
{
|
|
while (0 != (ap = lp1->addr)) /* note the assignment! */
|
|
{
|
|
assert(0 == *ap->addr);
|
|
*ap->addr =
|
|
USHBIN_ONLY((INTPTR_T)&lbl_tab->lnr_adr)
|
|
/* on non-shared binary resolve this address by adding the offset stored at lbl_tab address
|
|
* to the routine header, to arrive at the address at which the current line number entry is
|
|
* stored
|
|
*/
|
|
NON_USHBIN_ONLY((INTPTR_T)&lbl_tab->lab_ln_ptr);
|
|
lp1->addr = ap->next;
|
|
free(ap);
|
|
}
|
|
assert(0 == lp1->addr);
|
|
if (lp0 == (urx_labref *)rp1)
|
|
((urx_rtnref *)lp0)->lab = lp1->next;
|
|
else
|
|
lp0->next = lp1->next;
|
|
free(lp1);
|
|
}
|
|
lbl_tab++;
|
|
}
|
|
if (0 == rp1->lab)
|
|
{
|
|
rp0->next = rp1->next;
|
|
free(rp1);
|
|
}
|
|
}
|