Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright committed Dec 16, 2011
1 parent 577174a commit c0fd295
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 58 deletions.
102 changes: 76 additions & 26 deletions src/backend/cgobj.c
Expand Up @@ -535,7 +535,7 @@ seg_data *getsegment()
if (seg_count == seg_max)
{
seg_max += 10;
SegData = (seg_data **)mem_realloc(SegData, seg_max * sizeof(seg_data));
SegData = (seg_data **)mem_realloc(SegData, seg_max * sizeof(seg_data *));
memset(&SegData[seg_count], 0, 10 * sizeof(seg_data *));
}
assert(seg_count < seg_max);
Expand All @@ -546,6 +546,7 @@ seg_data *getsegment()

seg_data *pseg = SegData[seg];
pseg->SDseg = seg;
pseg->segidx = seg;
return pseg;
}

Expand Down Expand Up @@ -625,12 +626,22 @@ void obj_init(Outbuffer *objbuf, const char *filename, const char *csegname)
SegData[DATA]->SDseg = DATA;
SegData[CDATA]->SDseg = CDATA;
SegData[UDATA]->SDseg = UDATA;

SegData[CODE]->segidx = CODE;
SegData[DATA]->segidx = DATA;
SegData[CDATA]->segidx = CDATA;
SegData[UDATA]->segidx = UDATA;

seg_count = UDATA;

if (config.fulltypes)
{
SegData[DEBSYM]->SDseg = DEBSYM;
SegData[DEBTYP]->SDseg = DEBTYP;

SegData[DEBSYM]->segidx = DEBSYM;
SegData[DEBTYP]->segidx = DEBTYP;

seg_count = DEBTYP;
}

Expand Down Expand Up @@ -698,7 +709,7 @@ void obj_term()
int lseg = d->lseg;
char header[sizeof(d->header)];

if (lseg < 0) // if COMDAT
if (seg_is_comdat(lseg)) // if COMDAT
{
header[0] = d->flags | (d->offset ? 1 : 0); // continuation flag
header[1] = d->alloctyp;
Expand Down Expand Up @@ -763,7 +774,7 @@ void obj_term()
SegData[obj.lastfarcodesegi]->SDoffset = Coffset;
Coffset = obj.codeSegOffset; // reset for benefit of next line
}
objseggrp(Coffset,Doffset,0,UDoffset); // do real sizes
objseggrp(Coffset,Doffset,0,SegData[UDATA]->SDoffset); // do real sizes

// Update any out-of-date far segment sizes
for (i = 0; i <= seg_count; i++)
Expand Down Expand Up @@ -809,12 +820,12 @@ void objlinnum(Srcpos srcpos,targ_size_t offset)

#if MARS
if (!obj.term &&
(cseg < 0 || (srcpos.Sfilename && srcpos.Sfilename != obj.modname)))
(seg_is_comdat(cseg) || (srcpos.Sfilename && srcpos.Sfilename != obj.modname)))
#else
if (!srcpos.Sfilptr)
return;
sfile_debug(&srcpos_sfile(srcpos));
if (!obj.term && (!(srcpos_sfile(srcpos).SFflags & SFtop) || (cseg < 0 && !obj.term)))
if (!obj.term && (!(srcpos_sfile(srcpos).SFflags & SFtop) || (seg_is_comdat(cseg) && !obj.term)))
#endif
{ // Not original source file, or a COMDAT.
// Save data away and deal with it at close of compile.
Expand Down Expand Up @@ -867,7 +878,7 @@ void objlinnum(Srcpos srcpos,targ_size_t offset)
if (!obj.linrec) // if not allocated
{ obj.linrec = (char *) mem_calloc(LINRECMAX);
obj.linrec[0] = 0; // base group / flags
obj.linrecheader = 1 + insidx(obj.linrec + 1,cseg < 0 ? obj.pubnamidx : cseg);
obj.linrecheader = 1 + insidx(obj.linrec + 1,seg_is_comdat(cseg) ? obj.pubnamidx : cseg);
obj.linreci = obj.linrecheader;
obj.recseg = cseg;
#if MULTISCOPE
Expand All @@ -884,14 +895,14 @@ void objlinnum(Srcpos srcpos,targ_size_t offset)
}

// Select record type to use
obj.mlinnum = (cseg < 0) ? LINSYM : LINNUM;
obj.mlinnum = seg_is_comdat(cseg) ? LINSYM : LINNUM;
if (I32 && !(config.flags & CFGeasyomf))
obj.mlinnum++;
}
else if (obj.linreci > LINRECMAX - (2 + intsize))
{ objrecord(obj.mlinnum,obj.linrec,obj.linreci); // output data
obj.linreci = obj.linrecheader;
if (cseg < 0) // if LINSYM record
if (seg_is_comdat(cseg)) // if LINSYM record
obj.linrec[0] |= 1; // continuation bit
}
#if MULTISCOPE
Expand Down Expand Up @@ -1595,6 +1606,7 @@ void obj_staticctor(Symbol *s,int dtor,int seg)

seg_data *pseg = getsegment();
pseg->SDseg = obj.segidx++;
pseg->segidx = pseg->SDseg;
}

if (dtor)
Expand Down Expand Up @@ -1672,6 +1684,7 @@ void obj_funcptr(Symbol *s)
objsegdef(dsegattr,(i & 2) + tysize[TYnptr],obj.lnameidx + 1,DATACLASS);
seg_data *pseg = getsegment();
pseg->SDseg = obj.segidx;
pseg->segidx = obj.segidx;
reftoident(obj.segidx,0,s,0,0); // put out function pointer
obj.segidx++;

Expand Down Expand Up @@ -1876,6 +1889,7 @@ int obj_comdat(Symbol *s)
obj.ledata->flags |= 0x04; // local bit (make it an "LCOMDAT")
seg_data *pseg = getsegment();
pseg->SDseg = -obj.extidx;
pseg->segidx = -obj.extidx;
return -obj.extidx;
}

Expand Down Expand Up @@ -1980,6 +1994,7 @@ seg_data *obj_tlsseg()
objsegdef(segattr,0,obj.lnameidx,obj.lnameidx + 1);
SegData[obj.tlssegi]->attr = segattr;
SegData[obj.tlssegi]->SDseg = obj.tlsseg;
SegData[obj.tlssegi]->segidx = obj.tlsseg;

// Put out ending segment (.tls$ZZZ)
objsegdef(segattr,0,obj.lnameidx + 3,obj.lnameidx + 1);
Expand Down Expand Up @@ -2014,7 +2029,7 @@ int obj_fardata(char *name,targ_size_t size,targ_size_t *poffset)
)
{ *poffset = SegData[i]->SDoffset; // BUG: should align this
SegData[i]->SDoffset += size;
return SegData[i]->seg;
return SegData[i]->segidx;
}

// No. We need to build a new far segment
Expand Down Expand Up @@ -2061,21 +2076,13 @@ int obj_fardata(char *name,targ_size_t size,targ_size_t *poffset)

STATIC int obj_newfarseg(targ_size_t size,int classidx)
{
#if 1
seg_data *f;
f = getsegment();
int i = seg_count;
seg_data *f = getsegment();
int i = f->SDseg;
f->SDseg = obj.segidx;
#else
int i = obj.farsegi++;
Farseg *f;

obj.farseg = (Farseg *) mem_realloc(obj.farseg,sizeof(Farseg) * obj.farsegi);
f = &SegData[i];
#endif
f->segidx = obj.segidx;
f->isfarseg = true;
f->seek = obj.buf->size();
f->seg = obj.segidx;
f->segidx = obj.segidx;
f->attr = obj.fdsegattr;
f->origsize = size;
f->SDoffset = size;
Expand Down Expand Up @@ -2324,6 +2331,37 @@ void obj_export(Symbol *s,unsigned argsize)
objrecord(COMENT,coment,4 + len + 1); // module name record
}

/*******************************
* Update data information about symbol
* align for output and assign segment
* if not already specified.
*
* Input:
* sdata data symbol
* datasize output size
* seg default seg if not known
* Returns:
* actual seg
*/

int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg)
{
targ_size_t alignbytes;
//printf("elf_data_start(%s,size %llx,seg %d)\n",sdata->Sident,datasize,seg);
//symbol_print(sdata);

if (sdata->Sseg == UNKNOWN) // if we don't know then there
sdata->Sseg = seg; // wasn't any segment override
else
seg = sdata->Sseg;
targ_size_t offset = SegData[seg]->SDoffset;
alignbytes = align(datasize, offset) - offset;
if (alignbytes)
obj_lidata(seg, offset, alignbytes);
sdata->Soffset = offset + alignbytes;
return seg;
}

/********************************
* Output a public definition.
* Input:
Expand Down Expand Up @@ -2510,7 +2548,7 @@ int obj_comdef(Symbol *s,int flag,targ_size_t size,targ_size_t count)
void obj_write_zeros(seg_data *pseg, targ_size_t count)
{
obj_lidata(pseg->SDseg, pseg->SDoffset, count);
pseg->SDoffset += count;
//pseg->SDoffset += count;
}

/***************************************
Expand All @@ -2526,13 +2564,23 @@ void obj_lidata(int seg,targ_size_t offset,targ_size_t count)
char __ss *di;

//printf("obj_lidata(seg = %d, offset = x%x, count = %d)\n", seg, offset, count);

if (seg == cseg)
Coffset += count;
else if (seg >= 0)
SegData[seg]->SDoffset += count;

if (seg == UDATA)
return;

Lagain:
if (count <= sizeof(zero)) // if shorter to use ledata
{
obj_bytes(seg,offset,count,zero);
return;
}

if (seg < 0)
if (seg_is_comdat(seg))
{
while (count > sizeof(zero))
{
Expand All @@ -2559,7 +2607,10 @@ void obj_lidata(int seg,targ_size_t offset,targ_size_t count)
TOWORD(di + 4 + 2 + 2 + 2 + 2,1); // 1 byte of 0
reclen = i + 4 + 5 * 2;
objrecord(obj.mlidata,data,reclen);
obj_lidata(seg,offset + (count & ~0x7FFFL),count & 0x7FFF);

offset += (count & ~0x7FFFL);
count &= 0x7FFF;
goto Lagain;
}
else
{
Expand Down Expand Up @@ -2842,7 +2893,7 @@ STATIC void ledata_new(int seg,targ_size_t offset)
obj.ledata = (Ledatarec *) mem_calloc(sizeof(Ledatarec));
obj.ledata->lseg = seg;
obj.ledata->offset = offset;
if (seg < 0 && offset) // if continuation of an existing COMDAT
if (seg_is_comdat(seg) && offset) // if continuation of an existing COMDAT
{ list_t dl;

for (dl = obj.ledata_list; 1; dl = list_next(dl))
Expand All @@ -2862,7 +2913,6 @@ STATIC void ledata_new(int seg,targ_size_t offset)
}
}
list_prepend(&obj.ledata_list,obj.ledata);
// list_append(&obj.ledata_list,obj.ledata);
}

/***********************************
Expand Down
8 changes: 1 addition & 7 deletions src/backend/cod3.c
Expand Up @@ -1183,9 +1183,6 @@ void outjmptab(block *b)
/* Any alignment bytes necessary */
alignbytes = align(0,*poffset) - *poffset;
obj_lidata(jmpseg,*poffset,alignbytes);
#if OMFOBJ
*poffset += alignbytes;
#endif

def = list_block(b->Bsucc)->Boffset; /* default address */
assert(vmin <= vmax);
Expand Down Expand Up @@ -1226,6 +1223,7 @@ void outswitab(block *b)

if (config.flags & CFGromable)
{ poffset = &Coffset;
assert(cseg == CODE);
seg = cseg;
}
else
Expand All @@ -1235,11 +1233,7 @@ void outswitab(block *b)
}
offset = *poffset;
alignbytes = align(0,*poffset) - *poffset;
//printf("\t*poffset = x%x, alignbytes = %d, intsize = %d\n", *poffset, alignbytes, intsize);
obj_lidata(seg,*poffset,alignbytes); /* any alignment bytes necessary */
#if OMFOBJ
*poffset += alignbytes;
#endif
assert(*poffset == offset + alignbytes);

sz = intsize;
Expand Down
7 changes: 3 additions & 4 deletions src/backend/code.h
Expand Up @@ -921,11 +921,11 @@ void cgsched_pentium(code **pc,regm_t scratch);

struct seg_data
{
int SDseg; // omf file segment index
int SDseg; // index into SegData[]
targ_size_t SDoffset; // starting offset for data

bool isfarseg;
int seg; // segment number
int segidx; // internal object file segment number
int lnameidx; // lname idx of segment name
int classidx; // lname idx of class name
unsigned attr; // segment attribute
Expand Down Expand Up @@ -955,7 +955,7 @@ struct linnum_data

struct seg_data
{
int SDseg; // segment index
int SDseg; // segment index into SegData[]
IDXSEC SDshtidx; // section header table index
targ_size_t SDoffset; // starting offset for data
Outbuffer *SDbuf; // buffer to hold data
Expand Down Expand Up @@ -987,7 +987,6 @@ extern seg_data **SegData;
#define Offset(seg) SegData[seg]->SDoffset
#define Doffset SegData[DATA]->SDoffset
#define CDoffset SegData[CDATA]->SDoffset
#define UDoffset SegData[UDATA]->SDoffset

#if __cplusplus && TX86
}
Expand Down
2 changes: 1 addition & 1 deletion src/backend/global.h
Expand Up @@ -397,6 +397,7 @@ void objend(void);
void obj_export(Symbol *s, unsigned argsize);
void objpubdef(int seg, Symbol *s, targ_size_t offset);
int objextdef(const char *);
int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg);
int objextern(Symbol *);
int obj_comdef(Symbol *s, int flag, targ_size_t size, targ_size_t count);
void obj_lidata(int seg, targ_size_t offset, targ_size_t count);
Expand Down Expand Up @@ -556,7 +557,6 @@ void mach_addrel(int seg, targ_size_t offset, symbol *targsym,
unsigned targseg, int rtype, int val = 0);
#endif
void elf_func_start(Symbol *sfunc);
int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg);
void elf_func_term(Symbol *sfunc);
unsigned elf_addstr(Outbuffer *strtab, const char *);

Expand Down

0 comments on commit c0fd295

Please sign in to comment.