* object to class for ow/og objects

* split objectdata from objectoutput
This commit is contained in:
peter 2000-12-23 19:59:35 +00:00
parent ecbd858b14
commit b7c591affd
9 changed files with 1024 additions and 908 deletions

View File

@ -98,7 +98,8 @@ uses
verbose,comphook,systems,
cutils,cobjects,globals,options,fmodule,parser,symtable,
link,import,export,tokens,
cpunode
{ cpu overrides }
cpuswtch,cpunode
;
function Compile(const cmd:string):longint;
@ -318,7 +319,11 @@ end;
end.
{
$Log$
Revision 1.11 2000-11-29 00:30:30 florian
Revision 1.12 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.11 2000/11/29 00:30:30 florian
* unused units removed from uses clause
* some changes for widestrings

View File

@ -29,7 +29,10 @@ unit ag386bin;
interface
uses
cpubase,cobjects,aasm,fmodule,finput,assemble;
cobjects,
cpubase,aasm,
fmodule,finput,
ogbase,assemble;
type
togtype=(og_none,og_dbg,og_coff,og_pecoff,og_elf);
@ -82,8 +85,10 @@ interface
{$ifdef GDB}
gdb,
{$endif}
ogbase,
ogcoff,ogelf;
{ binary writers }
ogcoff,ogelf
;
{$ifdef GDB}
@ -122,7 +127,7 @@ interface
{ When in pass 1 then only alloc and leave }
if currpass=1 then
begin
objectalloc^.staballoc(hp);
objectalloc.staballoc(hp);
if assigned(hp) then
p[i]:='"';
exit;
@ -217,11 +222,14 @@ interface
if assigned(ps) and (ps^.section=sec_none) then
begin
if currpass=2 then
objectoutput^.writesymbol(ps);
objectoutput^.WriteSymStabs(sec,ofs,hp,ps,nidx,nother,line,reloc)
begin
objectdata.writesymbol(ps);
objectoutput.exportsymbol(ps);
end;
objectdata.WriteSymStabs(sec,ofs,hp,ps,nidx,nother,line,reloc)
end
else
objectoutput^.WriteStabs(sec,ofs,hp,nidx,nother,line,reloc);
objectdata.WriteStabs(sec,ofs,hp,nidx,nother,line,reloc);
if assigned(hp) then
p[ii]:='"';
end;
@ -233,13 +241,13 @@ interface
begin
if currpass=1 then
begin
objectalloc^.staballoc(nil);
objectalloc.staballoc(nil);
exit;
end;
if (nidx=n_textline) and assigned(funcname) and
(target_os.use_function_relative_addresses) then
objectoutput^.WriteStabs(sec_code,objectoutput^.sectionsize(sec_code)-funcname^.address,
objectdata.WriteStabs(sec_code,objectdata.sectionsize(sec_code)-funcname^.address,
nil,nidx,0,line,false)
else
begin
@ -249,7 +257,7 @@ interface
sec:=sec_data
else
sec:=sec_bss;
objectoutput^.WriteStabs(sec,objectoutput^.sectionsize(sec),
objectdata.WriteStabs(sec,objectdata.sectionsize(sec),
nil,nidx,0,line,true);
end;
end;
@ -284,11 +292,11 @@ interface
hp:=newasmsymboltype('Ltext'+ToStr(IncludeCount),AB_LOCAL,AT_FUNCTION);
if currpass=1 then
begin
hp^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
hp^.setaddress(objectalloc.currsec,objectalloc.sectionsize,0);
UsedAsmSymbolListInsert(hp);
end
else
objectoutput^.writesymbol(hp);
objectdata.writesymbol(hp);
{ emit stabs }
if (infile^.path^<>'') then
EmitStabs('"'+lower(BsToSlash(FixPath(infile^.path^,false)))+'",'+tostr(curr_n)+
@ -327,18 +335,18 @@ interface
if not ((cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches)) then
exit;
store_sec:=objectalloc^.currsec;
objectalloc^.setsection(sec_code);
store_sec:=objectalloc.currsec;
objectalloc.setsection(sec_code);
hp:=newasmsymboltype('Letext',AB_LOCAL,AT_FUNCTION);
if currpass=1 then
begin
hp^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
hp^.setaddress(objectalloc.currsec,objectalloc.sectionsize,0);
UsedAsmSymbolListInsert(hp);
end
else
objectoutput^.writesymbol(hp);
objectdata.writesymbol(hp);
EmitStabs('"",'+tostr(n_sourcefile)+',0,0,Letext');
objectalloc^.setsection(store_sec);
objectalloc.setsection(store_sec);
end;
{$endif GDB}
@ -376,7 +384,7 @@ interface
{ always use the maximum fillsize in this pass to avoid possible
short jumps to become out of range }
pai_align(hp)^.fillsize:=pai_align(hp)^.aligntype;
objectalloc^.sectionalloc(pai_align(hp)^.fillsize);
objectalloc.sectionalloc(pai_align(hp)^.fillsize);
end;
ait_datablock :
begin
@ -386,52 +394,52 @@ interface
begin
l:=pai_datablock(hp)^.size;
if l>2 then
objectalloc^.sectionalign(4)
objectalloc.sectionalign(4)
else if l>1 then
objectalloc^.sectionalign(2);
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
objectalloc.sectionalign(2);
objectalloc.sectionalloc(pai_datablock(hp)^.size);
end;
end
else
begin
l:=pai_datablock(hp)^.size;
if l>2 then
objectalloc^.sectionalign(4)
objectalloc.sectionalign(4)
else if l>1 then
objectalloc^.sectionalign(2);
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
objectalloc.sectionalign(2);
objectalloc.sectionalloc(pai_datablock(hp)^.size);
end;
end;
ait_const_32bit :
objectalloc^.sectionalloc(4);
objectalloc.sectionalloc(4);
ait_const_16bit :
objectalloc^.sectionalloc(2);
objectalloc.sectionalloc(2);
ait_const_8bit :
objectalloc^.sectionalloc(1);
objectalloc.sectionalloc(1);
ait_real_80bit :
objectalloc^.sectionalloc(10);
objectalloc.sectionalloc(10);
ait_real_64bit :
objectalloc^.sectionalloc(8);
objectalloc.sectionalloc(8);
ait_real_32bit :
objectalloc^.sectionalloc(4);
objectalloc.sectionalloc(4);
ait_comp_64bit :
objectalloc^.sectionalloc(8);
objectalloc.sectionalloc(8);
ait_const_rva,
ait_const_symbol :
objectalloc^.sectionalloc(4);
objectalloc.sectionalloc(4);
ait_section:
objectalloc^.setsection(pai_section(hp)^.sec);
objectalloc.setsection(pai_section(hp)^.sec);
ait_symbol :
pai_symbol(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
pai_symbol(hp)^.sym^.setaddress(objectalloc.currsec,objectalloc.sectionsize,0);
ait_label :
pai_label(hp)^.l^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
pai_label(hp)^.l^.setaddress(objectalloc.currsec,objectalloc.sectionsize,0);
ait_string :
objectalloc^.sectionalloc(pai_string(hp)^.len);
objectalloc.sectionalloc(pai_string(hp)^.len);
ait_instruction :
begin
{ reset instructions which could change in pass 2 }
paicpu(hp)^.resetpass2;
objectalloc^.sectionalloc(paicpu(hp)^.Pass1(objectalloc^.sectionsize));
objectalloc.sectionalloc(paicpu(hp)^.Pass1(objectalloc.sectionsize));
end;
ait_cut :
if SmartAsm then
@ -454,7 +462,7 @@ interface
if ((cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches)) then
begin
if (objectalloc^.currsec<>sec_none) and
if (objectalloc.currsec<>sec_none) and
not(hp^.typ in [
ait_label,
ait_regalloc,ait_tempalloc,
@ -467,13 +475,13 @@ interface
ait_align :
begin
{ here we must determine the fillsize which is used in pass2 }
pai_align(hp)^.fillsize:=align(objectalloc^.sectionsize,pai_align(hp)^.aligntype)-
objectalloc^.sectionsize;
objectalloc^.sectionalloc(pai_align(hp)^.fillsize);
pai_align(hp)^.fillsize:=align(objectalloc.sectionsize,pai_align(hp)^.aligntype)-
objectalloc.sectionsize;
objectalloc.sectionalloc(pai_align(hp)^.fillsize);
end;
ait_datablock :
begin
if objectalloc^.currsec<>sec_bss then
if objectalloc.currsec<>sec_bss then
Message(asmw_e_alloc_data_only_in_bss);
if not SmartAsm then
begin
@ -488,49 +496,49 @@ interface
begin
l:=pai_datablock(hp)^.size;
if l>2 then
objectalloc^.sectionalign(4)
objectalloc.sectionalign(4)
else if l>1 then
objectalloc^.sectionalign(2);
pai_datablock(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,
objectalloc.sectionalign(2);
pai_datablock(hp)^.sym^.setaddress(objectalloc.currsec,objectalloc.sectionsize,
pai_datablock(hp)^.size);
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
objectalloc.sectionalloc(pai_datablock(hp)^.size);
end;
end
else
begin
l:=pai_datablock(hp)^.size;
if l>2 then
objectalloc^.sectionalign(4)
objectalloc.sectionalign(4)
else if l>1 then
objectalloc^.sectionalign(2);
pai_datablock(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,pai_datablock(hp)^.size);
objectalloc^.sectionalloc(pai_datablock(hp)^.size);
objectalloc.sectionalign(2);
pai_datablock(hp)^.sym^.setaddress(objectalloc.currsec,objectalloc.sectionsize,pai_datablock(hp)^.size);
objectalloc.sectionalloc(pai_datablock(hp)^.size);
end;
UsedAsmSymbolListInsert(pai_datablock(hp)^.sym);
end;
ait_const_32bit :
objectalloc^.sectionalloc(4);
objectalloc.sectionalloc(4);
ait_const_16bit :
objectalloc^.sectionalloc(2);
objectalloc.sectionalloc(2);
ait_const_8bit :
objectalloc^.sectionalloc(1);
objectalloc.sectionalloc(1);
ait_real_80bit :
objectalloc^.sectionalloc(10);
objectalloc.sectionalloc(10);
ait_real_64bit :
objectalloc^.sectionalloc(8);
objectalloc.sectionalloc(8);
ait_real_32bit :
objectalloc^.sectionalloc(4);
objectalloc.sectionalloc(4);
ait_comp_64bit :
objectalloc^.sectionalloc(8);
objectalloc.sectionalloc(8);
ait_const_rva,
ait_const_symbol :
begin
objectalloc^.sectionalloc(4);
objectalloc.sectionalloc(4);
UsedAsmSymbolListInsert(pai_const_symbol(hp)^.sym);
end;
ait_section:
begin
objectalloc^.setsection(pai_section(hp)^.sec);
objectalloc.setsection(pai_section(hp)^.sec);
{$ifdef GDB}
case pai_section(hp)^.sec of
sec_code : n_line:=n_textline;
@ -562,27 +570,27 @@ interface
{$endif}
ait_symbol :
begin
pai_symbol(hp)^.sym^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
pai_symbol(hp)^.sym^.setaddress(objectalloc.currsec,objectalloc.sectionsize,0);
UsedAsmSymbolListInsert(pai_symbol(hp)^.sym);
end;
ait_symbol_end :
begin
if target_info.target=target_i386_linux then
begin
pai_symbol(hp)^.sym^.size:=objectalloc^.sectionsize-pai_symbol(hp)^.sym^.address;
pai_symbol(hp)^.sym^.size:=objectalloc.sectionsize-pai_symbol(hp)^.sym^.address;
UsedAsmSymbolListInsert(pai_symbol(hp)^.sym);
end;
end;
ait_label :
begin
pai_label(hp)^.l^.setaddress(objectalloc^.currsec,objectalloc^.sectionsize,0);
pai_label(hp)^.l^.setaddress(objectalloc.currsec,objectalloc.sectionsize,0);
UsedAsmSymbolListInsert(pai_label(hp)^.l);
end;
ait_string :
objectalloc^.sectionalloc(pai_string(hp)^.len);
objectalloc.sectionalloc(pai_string(hp)^.len);
ait_instruction :
begin
objectalloc^.sectionalloc(paicpu(hp)^.Pass1(objectalloc^.sectionsize));
objectalloc.sectionalloc(paicpu(hp)^.Pass1(objectalloc.sectionsize));
{ fixup the references }
for i:=1 to paicpu(hp)^.ops do
begin
@ -629,7 +637,7 @@ interface
if ((cs_debuginfo in aktmoduleswitches) or
(cs_gdb_lineinfo in aktglobalswitches)) then
begin
if (objectoutput^.currsec<>sec_none) and
if (objectdata.currsec<>sec_none) and
not(hp^.typ in [
ait_label,
ait_regalloc,ait_tempalloc,
@ -640,10 +648,10 @@ interface
{$endif GDB}
case hp^.typ of
ait_align :
objectoutput^.writebytes(pai_align(hp)^.getfillbuf^,pai_align(hp)^.fillsize);
objectdata.writebytes(pai_align(hp)^.getfillbuf^,pai_align(hp)^.fillsize);
ait_section :
begin
objectoutput^.defaultsection(pai_section(hp)^.sec);
objectdata.defaultsection(pai_section(hp)^.sec);
{$ifdef GDB}
case pai_section(hp)^.sec of
sec_code : n_line:=n_textline;
@ -656,32 +664,36 @@ interface
{$endif GDB}
end;
ait_symbol :
objectoutput^.writesymbol(pai_symbol(hp)^.sym);
begin
objectdata.writesymbol(pai_symbol(hp)^.sym);
objectoutput.exportsymbol(pai_symbol(hp)^.sym);
end;
ait_datablock :
begin
objectoutput^.writesymbol(pai_datablock(hp)^.sym);
objectdata.writesymbol(pai_datablock(hp)^.sym);
objectoutput.exportsymbol(pai_datablock(hp)^.sym);
if SmartAsm or (not pai_datablock(hp)^.is_global) then
begin
l:=pai_datablock(hp)^.size;
if l>2 then
objectoutput^.allocalign(4)
objectdata.allocalign(4)
else if l>1 then
objectoutput^.allocalign(2);
objectoutput^.alloc(pai_datablock(hp)^.size);
objectdata.allocalign(2);
objectdata.alloc(pai_datablock(hp)^.size);
end;
end;
ait_const_32bit :
objectoutput^.writebytes(pai_const(hp)^.value,4);
objectdata.writebytes(pai_const(hp)^.value,4);
ait_const_16bit :
objectoutput^.writebytes(pai_const(hp)^.value,2);
objectdata.writebytes(pai_const(hp)^.value,2);
ait_const_8bit :
objectoutput^.writebytes(pai_const(hp)^.value,1);
objectdata.writebytes(pai_const(hp)^.value,1);
ait_real_80bit :
objectoutput^.writebytes(pai_real_80bit(hp)^.value,10);
objectdata.writebytes(pai_real_80bit(hp)^.value,10);
ait_real_64bit :
objectoutput^.writebytes(pai_real_64bit(hp)^.value,8);
objectdata.writebytes(pai_real_64bit(hp)^.value,8);
ait_real_32bit :
objectoutput^.writebytes(pai_real_32bit(hp)^.value,4);
objectdata.writebytes(pai_real_32bit(hp)^.value,4);
ait_comp_64bit :
begin
{$ifdef FPC}
@ -689,18 +701,23 @@ interface
{$else}
co:=pai_comp_64bit(hp)^.value;
{$endif}
objectoutput^.writebytes(co,8);
objectdata.writebytes(co,8);
end;
ait_string :
objectoutput^.writebytes(pai_string(hp)^.str^,pai_string(hp)^.len);
objectdata.writebytes(pai_string(hp)^.str^,pai_string(hp)^.len);
ait_const_rva :
objectoutput^.writereloc(pai_const_symbol(hp)^.offset,4,
objectdata.writereloc(pai_const_symbol(hp)^.offset,4,
pai_const_symbol(hp)^.sym,relative_rva);
ait_const_symbol :
objectoutput^.writereloc(pai_const_symbol(hp)^.offset,4,
objectdata.writereloc(pai_const_symbol(hp)^.offset,4,
pai_const_symbol(hp)^.sym,relative_false);
ait_label :
objectoutput^.writesymbol(pai_label(hp)^.l);
begin
objectdata.writesymbol(pai_label(hp)^.l);
{ exporting shouldn't be necessary as labels are local,
but it's better to be on the safe side (PFV) }
objectoutput.exportsymbol(pai_label(hp)^.l);
end;
ait_instruction :
paicpu(hp)^.Pass2;
{$ifdef GDB}
@ -732,18 +749,18 @@ interface
label
doexit;
begin
objectalloc^.resetsections;
objectalloc^.setsection(sec_code);
objectalloc.resetsections;
objectalloc.setsection(sec_code);
objectoutput^.initwriting(cut_normal);
objectoutput^.defaultsection(sec_code);
objectdata:=objectoutput.initwriting(cut_normal);
objectdata.defaultsection(sec_code);
{ reset the asmsymbol list }
InitUsedAsmsymbolList;
{$ifdef MULTIPASS}
{ Pass 0 }
currpass:=0;
objectalloc^.setsection(sec_code);
objectalloc.setsection(sec_code);
{ start with list 1 }
currlistidx:=1;
currlist:=list[currlistidx];
@ -760,8 +777,8 @@ interface
{ Pass 1 }
currpass:=1;
objectalloc^.resetsections;
objectalloc^.setsection(sec_code);
objectalloc.resetsections;
objectalloc.setsection(sec_code);
{$ifdef GDB}
StartFileLineInfo;
{$endif GDB}
@ -781,7 +798,7 @@ interface
UsedAsmSymbolListCheckUndefined;
{ set section sizes }
objectoutput^.setsectionsizes(objectalloc^.secsize);
objectdata.setsectionsizes(objectalloc.secsize);
{ leave if errors have occured }
if errorcount>0 then
goto doexit;
@ -809,7 +826,8 @@ interface
goto doexit;
{ write last objectfile }
objectoutput^.donewriting;
objectoutput.donewriting;
objectdata:=nil;
doexit:
{ reset the used symbols back, must be after the .o has been
@ -825,11 +843,11 @@ interface
startsec : tsection;
place: tcutplace;
begin
objectalloc^.resetsections;
objectalloc^.setsection(sec_code);
objectalloc.resetsections;
objectalloc.setsection(sec_code);
objectoutput^.initwriting(cut_normal);
objectoutput^.defaultsection(sec_code);
objectdata:=objectoutput.initwriting(cut_normal);
objectdata.defaultsection(sec_code);
startsec:=sec_code;
{ start with list 1 }
@ -844,8 +862,8 @@ interface
{$ifdef MULTIPASS}
{ Pass 0 }
currpass:=0;
objectalloc^.resetsections;
objectalloc^.setsection(startsec);
objectalloc.resetsections;
objectalloc.setsection(startsec);
TreePass0(hp);
{ leave if errors have occured }
if errorcount>0 then
@ -854,8 +872,8 @@ interface
{ Pass 1 }
currpass:=1;
objectalloc^.resetsections;
objectalloc^.setsection(startsec);
objectalloc.resetsections;
objectalloc.setsection(startsec);
{$ifdef GDB}
StartFileLineInfo;
{$endif GDB}
@ -867,14 +885,14 @@ interface
UsedAsmSymbolListCheckUndefined;
{ set section sizes }
objectoutput^.setsectionsizes(objectalloc^.secsize);
objectdata.setsectionsizes(objectalloc.secsize);
{ leave if errors have occured }
if errorcount>0 then
exit;
{ Pass 2 }
currpass:=2;
objectoutput^.defaultsection(startsec);
objectdata.defaultsection(startsec);
{$ifdef GDB}
StartFileLineInfo;
{$endif GDB}
@ -887,7 +905,8 @@ interface
exit;
{ if not end then write the current objectfile }
objectoutput^.donewriting;
objectoutput.donewriting;
objectdata:=nil;
{ reset the used symbols back, must be after the .o has been
written }
@ -899,7 +918,7 @@ interface
break;
{ save section for next loop }
{ this leads to a problem if startsec is sec_none !! PM }
startsec:=objectalloc^.currsec;
startsec:=objectalloc.currsec;
{ we will start a new objectfile so reset everything }
{ The place can still change in the next while loop, so don't init }
@ -920,7 +939,7 @@ interface
hp:=pai(hp^.next);
end;
objectoutput^.initwriting(place);
objectdata:=objectoutput.initwriting(place);
hp:=pai(hp^.next);
@ -973,15 +992,15 @@ interface
og_none :
Message(asmw_f_no_binary_writer_selected);
og_coff :
objectoutput:=new(pcoffoutput,initdjgpp(smart));
objectoutput:=tcoffoutput.createdjgpp(smart);
og_pecoff :
objectoutput:=new(pcoffoutput,initwin32(smart));
objectoutput:=tcoffoutput.createwin32(smart);
og_elf :
objectoutput:=new(pelf32output,init(smart));
objectoutput:=telf32output.create(smart);
else
internalerror(43243432);
end;
objectalloc:=new(pobjectalloc,init);
objectalloc:=tobjectalloc.create;
SmartAsm:=smart;
currpass:=0;
end;
@ -996,8 +1015,8 @@ interface
{$ifdef MEMDEBUG}
d.init('agbin');
{$endif}
dispose(objectoutput,done);
dispose(objectalloc,done);
objectoutput.free;
objectalloc.free;
{$ifdef MEMDEBUG}
d.done;
{$endif}
@ -1006,7 +1025,11 @@ interface
end.
{
$Log$
Revision 1.2 2000-12-12 19:50:21 peter
Revision 1.3 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.2 2000/12/12 19:50:21 peter
* clear usedasmsymbol at exit of writetree
Revision 1.1 2000/11/30 22:18:48 florian

View File

@ -1015,7 +1015,7 @@ begin
R_GS : c:=$65;
R_SS : c:=$36;
end;
objectoutput^.writebytes(c,1);
objectdata.writebytes(c,1);
{ fix the offset for GenNode }
inc(InsOffset);
end;
@ -1405,7 +1405,7 @@ begin
((codes[0]=#1) and ((codes[2]=#5) or (codes[2]=#7)))) then
begin
bytes[0]:=$66;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
repeat
c:=ord(codes^);
@ -1415,7 +1415,7 @@ begin
break;
1,2,3 :
begin
objectoutput^.writebytes(codes^,c);
objectdata.writebytes(codes^,c);
inc(codes,c);
end;
4,6 :
@ -1453,7 +1453,7 @@ begin
else
InternalError(777004);
end;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
5,7 :
begin
@ -1475,18 +1475,18 @@ begin
else
InternalError(777005);
end;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
8,9,10 :
begin
bytes[0]:=ord(codes^)+regval(oper[c-8].reg);
inc(codes);
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
15 :
begin
bytes[0]:=0;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
12,13,14 :
begin
@ -1494,9 +1494,9 @@ begin
if (currval<-128) or (currval>127) then
Message2(asmw_e_value_exceeds_bounds,'signed byte',tostr(currval));
if assigned(currsym) then
objectoutput^.writereloc(currval,1,currsym,relative_false)
objectdata.writereloc(currval,1,currsym,relative_false)
else
objectoutput^.writebytes(currval,1);
objectdata.writebytes(currval,1);
end;
16,17,18 :
begin
@ -1504,9 +1504,9 @@ begin
if (currval<-256) or (currval>255) then
Message2(asmw_e_value_exceeds_bounds,'byte',tostr(currval));
if assigned(currsym) then
objectoutput^.writereloc(currval,1,currsym,relative_false)
objectdata.writereloc(currval,1,currsym,relative_false)
else
objectoutput^.writebytes(currval,1);
objectdata.writebytes(currval,1);
end;
20,21,22 :
begin
@ -1514,9 +1514,9 @@ begin
if (currval<0) or (currval>255) then
Message2(asmw_e_value_exceeds_bounds,'unsigned byte',tostr(currval));
if assigned(currsym) then
objectoutput^.writereloc(currval,1,currsym,relative_false)
objectdata.writereloc(currval,1,currsym,relative_false)
else
objectoutput^.writebytes(currval,1);
objectdata.writebytes(currval,1);
end;
24,25,26 :
begin
@ -1524,25 +1524,25 @@ begin
if (currval<-65536) or (currval>65535) then
Message2(asmw_e_value_exceeds_bounds,'word',tostr(currval));
if assigned(currsym) then
objectoutput^.writereloc(currval,2,currsym,relative_false)
objectdata.writereloc(currval,2,currsym,relative_false)
else
objectoutput^.writebytes(currval,2);
objectdata.writebytes(currval,2);
end;
28,29,30 :
begin
getvalsym(c-28);
if assigned(currsym) then
objectoutput^.writereloc(currval,4,currsym,relative_false)
objectdata.writereloc(currval,4,currsym,relative_false)
else
objectoutput^.writebytes(currval,4);
objectdata.writebytes(currval,4);
end;
32,33,34 :
begin
getvalsym(c-32);
if assigned(currsym) then
objectoutput^.writereloc(currval,4,currsym,relative_false)
objectdata.writereloc(currval,4,currsym,relative_false)
else
objectoutput^.writebytes(currval,4);
objectdata.writebytes(currval,4);
end;
40,41,42 :
begin
@ -1552,47 +1552,47 @@ begin
inc(data,currsym^.address);
if (data>127) or (data<-128) then
Message1(asmw_e_short_jmp_out_of_range,tostr(data));
objectoutput^.writebytes(data,1);
objectdata.writebytes(data,1);
end;
52,53,54 :
begin
getvalsym(c-52);
if assigned(currsym) then
objectoutput^.writereloc(currval,4,currsym,relative_true)
objectdata.writereloc(currval,4,currsym,relative_true)
else
objectoutput^.writereloc(currval-insend,4,nil,relative_false)
objectdata.writereloc(currval-insend,4,nil,relative_false)
end;
56,57,58 :
begin
getvalsym(c-56);
if assigned(currsym) then
objectoutput^.writereloc(currval,4,currsym,relative_true)
objectdata.writereloc(currval,4,currsym,relative_true)
else
objectoutput^.writereloc(currval-insend,4,nil,relative_false)
objectdata.writereloc(currval-insend,4,nil,relative_false)
end;
192,193,194 :
begin
if NeedAddrPrefix(c-192) then
begin
bytes[0]:=$67;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
end;
200 :
begin
bytes[0]:=$67;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
208 :
begin
bytes[0]:=$66;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
216 :
begin
bytes[0]:=ord(codes^)+condval[condition];
inc(codes);
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
201,
202,
@ -1636,24 +1636,24 @@ begin
end;
s:=pb-pchar(@bytes);
objectoutput^.writebytes(bytes,s);
objectdata.writebytes(bytes,s);
case ea_data.bytes of
0 : ;
1 :
begin
if (oper[opidx].ot and OT_MEMORY)=OT_MEMORY then
objectoutput^.writereloc(oper[opidx].ref^.offset,1,oper[opidx].ref^.symbol,relative_false)
objectdata.writereloc(oper[opidx].ref^.offset,1,oper[opidx].ref^.symbol,relative_false)
else
begin
bytes[0]:=oper[opidx].ref^.offset;
objectoutput^.writebytes(bytes,1);
objectdata.writebytes(bytes,1);
end;
inc(s);
end;
2,4 :
begin
objectoutput^.writereloc(oper[opidx].ref^.offset,ea_data.bytes,
objectdata.writereloc(oper[opidx].ref^.offset,ea_data.bytes,
oper[opidx].ref^.symbol,relative_false);
inc(s,ea_data.bytes);
end;
@ -1670,7 +1670,11 @@ end;
end.
{
$Log$
Revision 1.4 2000-12-07 17:19:45 jonas
Revision 1.5 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.4 2000/12/07 17:19:45 jonas
* new constant handling: from now on, hex constants >$7fffffff are
parsed as unsigned constants (otherwise, $80000000 got sign extended
and became $ffffffff80000000), all constants in the longint range

View File

@ -59,7 +59,7 @@ interface
poutputsymbol = ^toutputsymbol;
toutputsymbol = packed record
namestr : string[8]; { namestr or nameidx is used }
namestr : string[8]; { namestr or nameidx will be used }
nameidx : longint;
section : tsection;
value : longint;
@ -68,14 +68,13 @@ interface
size : longint;
end;
poutputsection = ^toutputsection;
toutputsection = object
tobjectsection = class
name : string[32];
secsymidx : longint; { index for the section in symtab }
addralign : longint;
{ size of the data and in the file }
data : PDynamicArray;
datasize : longint;
datasize : longint;
datapos : longint;
{ size and position in memory, set by setsectionsize }
memsize,
@ -84,8 +83,8 @@ interface
nrelocs : longint;
relochead : POutputReloc;
reloctail : ^POutputReloc;
constructor init(const Aname:string;Aalign:longint;alloconly:boolean);
destructor done;
constructor create(const Aname:string;Aalign:longint;alloconly:boolean);
destructor destroy;override;
function write(var d;l:longint):longint;
function writestr(const s:string):longint;
procedure writealign(l:longint);
@ -96,12 +95,30 @@ interface
procedure addsectionreloc(ofs:longint;sec:tsection;relative:relative_type);
end;
pobjectalloc = ^tobjectalloc;
tobjectalloc = object
tobjectdata = class
{ section }
currsec : tsection;
sects : array[TSection] of tobjectsection;
constructor create;
destructor destroy;override;
procedure createsection(sec:tsection);virtual;
procedure defaultsection(sec:tsection);
function sectionsize(s:tsection):longint;
procedure setsectionsizes(var s:tsecsize);virtual;
procedure alloc(len:longint);
procedure allocalign(len:longint);
procedure writebytes(var data;len:longint);
procedure writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);virtual;abstract;
procedure writesymbol(p:pasmsymbol);virtual;abstract;
procedure writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc:boolean);virtual;abstract;
procedure writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;nidx,nother,line:longint;reloc:boolean);virtual;abstract;
end;
tobjectalloc = class
currsec : tsection;
secsize : tsecsize;
constructor init;
destructor done;
constructor create;
destructor destroy;override;
procedure setsection(sec:tsection);
function sectionsize:longint;
procedure sectionalloc(l:longint);
@ -110,9 +127,8 @@ interface
procedure resetsections;
end;
pobjectoutput = ^tobjectoutput;
tobjectoutput = object
writer : pobjectwriter;
tobjectoutput = class
protected
path : pathstr;
ObjFile : string;
{ smartlinking }
@ -120,34 +136,32 @@ interface
place : tcutplace;
SmartFilesCount,
SmartHeaderCount : longint;
{ writer }
writer : tobjectwriter;
{ section }
currsec : tsection;
sects : array[TSection] of POutputSection;
constructor init(smart:boolean);
destructor done;virtual;
data : tobjectdata;
{ Writing }
procedure NextSmartName;
procedure initwriting(Aplace:tcutplace);virtual;
protected
procedure writetodisk;virtual;
public
constructor create(smart:boolean);
destructor destroy;override;
function initwriting(Aplace:tcutplace):tobjectdata;virtual;
procedure donewriting;virtual;
procedure createsection(sec:tsection);virtual;
procedure defaultsection(sec:tsection);
function sectionsize(s:tsection):longint;
procedure setsectionsizes(var s:tsecsize);virtual;
procedure alloc(len:longint);
procedure allocalign(len:longint);
procedure writebytes(var data;len:longint);
procedure writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);virtual;
procedure writesymbol(p:pasmsymbol);virtual;
procedure writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc:boolean);virtual;
procedure writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
nidx,nother,line:longint;reloc:boolean);virtual;
procedure exportsymbol(p:pasmsymbol);
end;
var
objectalloc : pobjectalloc;
objectoutput : pobjectoutput;
{ current object data, used in ag386bin/cpuasm }
objectdata : tobjectdata;
{ current object allocator }
objectalloc : tobjectalloc;
{ current object writer used }
objectoutput : tobjectoutput;
implementation
implementation
uses
comphook,
@ -158,12 +172,12 @@ interface
tobjectalloc
****************************************************************************}
constructor tobjectalloc.init;
constructor tobjectalloc.create;
begin
end;
destructor tobjectalloc.done;
destructor tobjectalloc.destroy;
begin
end;
@ -211,7 +225,7 @@ interface
TSectionOutput
****************************************************************************}
constructor toutputsection.init(const Aname:string;Aalign:longint;alloconly:boolean);
constructor tobjectsection.create(const Aname:string;Aalign:longint;alloconly:boolean);
begin
name:=Aname;
secsymidx:=0;
@ -233,14 +247,14 @@ interface
end;
destructor toutputsection.done;
destructor tobjectsection.destroy;
begin
if assigned(Data) then
dispose(Data,done);
end;
function toutputsection.write(var d;l:longint):longint;
function tobjectsection.write(var d;l:longint):longint;
begin
write:=datasize;
if not assigned(Data) then
@ -250,7 +264,7 @@ interface
end;
function toutputsection.writestr(const s:string):longint;
function tobjectsection.writestr(const s:string):longint;
begin
writestr:=datasize;
if not assigned(Data) then
@ -260,7 +274,7 @@ interface
end;
procedure toutputsection.writealign(l:longint);
procedure tobjectsection.writealign(l:longint);
var
i : longint;
empty : array[0..63] of char;
@ -281,19 +295,19 @@ interface
end;
function toutputsection.aligneddatasize:longint;
function tobjectsection.aligneddatasize:longint;
begin
aligneddatasize:=align(datasize,addralign);
end;
procedure toutputsection.alignsection;
procedure tobjectsection.alignsection;
begin
writealign(addralign);
end;
procedure toutputsection.alloc(l:longint);
procedure tobjectsection.alloc(l:longint);
begin
if assigned(Data) then
Internalerror(3334442);
@ -301,7 +315,7 @@ interface
end;
procedure toutputsection.addsymreloc(ofs:longint;p:pasmsymbol;relative:relative_type);
procedure tobjectsection.addsymreloc(ofs:longint;p:pasmsymbol;relative:relative_type);
var
r : POutputReloc;
begin
@ -317,7 +331,7 @@ interface
end;
procedure toutputsection.addsectionreloc(ofs:longint;sec:tsection;relative:relative_type);
procedure tobjectsection.addsectionreloc(ofs:longint;sec:tsection;relative:relative_type);
var
r : POutputReloc;
begin
@ -333,11 +347,87 @@ interface
end;
{****************************************************************************
tobjectdata
****************************************************************************}
constructor tobjectdata.create;
begin
{ reset }
FillChar(Sects,sizeof(Sects),0);
end;
destructor tobjectdata.destroy;
var
sec : tsection;
begin
{ free memory }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
sects[sec].free;
end;
procedure tobjectdata.createsection(sec:tsection);
begin
sects[sec]:=tobjectsection.create(target_asm.secnames[sec],1,(sec=sec_bss));
end;
function tobjectdata.sectionsize(s:tsection):longint;
begin
if assigned(sects[s]) then
sectionsize:=sects[s].datasize
else
sectionsize:=0;
end;
procedure tobjectdata.setsectionsizes(var s:tsecsize);
begin
end;
procedure tobjectdata.defaultsection(sec:tsection);
begin
currsec:=sec;
end;
procedure tobjectdata.writebytes(var data;len:longint);
begin
if not assigned(sects[currsec]) then
createsection(currsec);
sects[currsec].write(data,len);
end;
procedure tobjectdata.alloc(len:longint);
begin
if not assigned(sects[currsec]) then
createsection(currsec);
sects[currsec].alloc(len);
end;
procedure tobjectdata.allocalign(len:longint);
var
modulo : longint;
begin
if not assigned(sects[currsec]) then
createsection(currsec);
modulo:=sects[currsec].datasize mod len;
if modulo > 0 then
sects[currsec].alloc(len-modulo);
end;
{****************************************************************************
tobjectoutput
****************************************************************************}
constructor tobjectoutput.init(smart:boolean);
constructor tobjectoutput.create(smart:boolean);
begin
SmartFilesCount:=0;
SmartHeaderCount:=0;
@ -358,15 +448,16 @@ interface
path:=current_module^.path^;
{ init writer }
if objsmart and
not(cs_asm_leave in aktglobalswitches) then writer:=New(parobjectwriter,Init(current_module^.staticlibfilename^))
not(cs_asm_leave in aktglobalswitches) then
writer:=tarobjectwriter.create(current_module^.staticlibfilename^)
else
writer:=New(pobjectwriter,Init);
writer:=tobjectwriter.create;
end;
destructor tobjectoutput.done;
destructor tobjectoutput.destroy;
begin
Dispose(writer,done);
writer.free;
end;
@ -396,117 +487,57 @@ interface
end;
procedure tobjectoutput.initwriting(Aplace:tcutplace);
procedure tobjectoutput.writetodisk;
begin
end;
function tobjectoutput.initwriting(Aplace:tcutplace):tobjectdata;
begin
place:=Aplace;
{ the data should be set by the real output like coffoutput }
data:=nil;
initwriting:=nil;
{ open the writer }
if objsmart then
NextSmartName;
writer^.create(objfile);
{ reset }
FillChar(Sects,sizeof(Sects),0);
writer.createfile(objfile);
end;
procedure tobjectoutput.donewriting;
var
sec : tsection;
begin
{ free memory }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
dispose(sects[sec],done);
{ Only write the .o if there are no errors }
if errorcount=0 then
writetodisk;
{ close the writer }
writer^.close;
writer.closefile;
{ free data }
data.free;
data:=nil;
end;
procedure tobjectoutput.createsection(sec:tsection);
procedure tobjectoutput.exportsymbol(p:pasmsymbol);
begin
sects[sec]:=new(poutputsection,init(target_asm.secnames[sec],1,(sec=sec_bss)));
end;
function tobjectoutput.sectionsize(s:tsection):longint;
begin
if assigned(sects[s]) then
sectionsize:=sects[s]^.datasize
else
sectionsize:=0;
end;
procedure tobjectoutput.setsectionsizes(var s:tsecsize);
begin
end;
procedure tobjectoutput.defaultsection(sec:tsection);
begin
currsec:=sec;
end;
procedure tobjectoutput.writebytes(var data;len:longint);
begin
if not assigned(sects[currsec]) then
createsection(currsec);
sects[currsec]^.write(data,len);
end;
procedure tobjectoutput.alloc(len:longint);
begin
if not assigned(sects[currsec]) then
createsection(currsec);
sects[currsec]^.alloc(len);
end;
procedure tobjectoutput.allocalign(len:longint);
var
modulo : longint;
begin
if not assigned(sects[currsec]) then
createsection(currsec);
modulo:=sects[currsec]^.datasize mod len;
if modulo > 0 then
sects[currsec]^.alloc(len-modulo);
end;
procedure tobjectoutput.writesymbol(p:pasmsymbol);
begin
Do_halt(211);
end;
procedure tobjectoutput.writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);
begin
Do_halt(211);
end;
procedure tobjectoutput.writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc:boolean);
begin
Do_halt(211);
end;
procedure tobjectoutput.writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
nidx,nother,line:longint;reloc:boolean);
begin
Do_halt(211);
{ export globals and common symbols, this is needed
for .a files }
if p^.bind in [AB_GLOBAL,AB_COMMON] then
writer.writesym(p^.name);
end;
end.
{
$Log$
Revision 1.2 2000-11-13 21:56:07 peter
Revision 1.3 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.2 2000/11/13 21:56:07 peter
* removed some virtual from methods
* sectionsize method implemented (fixes lineinfo stabs)
Revision 1.1 2000/11/12 22:20:37 peter
* create generic toutputsection for binary writers
* create generic tobjectsection for binary writers
}

View File

@ -41,36 +41,44 @@ interface
ogbase;
type
pcoffsection = ^tcoffsection;
tcoffsection = object(toutputsection)
tcoffsection = class(tobjectsection)
public
flags : cardinal;
relocpos : longint;
constructor initsec(sec:TSection;AAlign,AFlags:cardinal);
constructor createsec(sec:TSection;AAlign,AFlags:cardinal);
end;
pcoffoutput = ^tcoffoutput;
tcoffoutput = object(tobjectoutput)
tcoffdata = class(tobjectdata)
private
win32 : boolean;
procedure reset;
public
constructor createdjgpp;
constructor createwin32;
destructor destroy;override;
procedure setsectionsizes(var s:tsecsize);override;
procedure createsection(sec:tsection);override;
procedure writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);override;
procedure writesymbol(p:pasmsymbol);override;
procedure writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc:boolean);override;
procedure writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;nidx,nother,line:longint;reloc:boolean);override;
strs,
syms : Pdynamicarray;
initsym : longint;
constructor initdjgpp(smart:boolean);
constructor initwin32(smart:boolean);
destructor done;virtual;
procedure initwriting(Aplace:tcutplace);virtual;
procedure donewriting;virtual;
procedure setsectionsizes(var s:tsecsize);virtual;
procedure createsection(sec:tsection);virtual;
procedure writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);virtual;
procedure writesymbol(p:pasmsymbol);virtual;
procedure writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc:boolean);virtual;
procedure writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
nidx,nother,line:longint;reloc:boolean);virtual;
end;
tcoffoutput = class(tobjectoutput)
private
procedure write_relocs(s:poutputsection);
win32 : boolean;
initsym : longint;
procedure write_relocs(s:tobjectsection);
procedure write_symbol(const name:string;strpos,value,section,typ,aux:longint);
procedure write_symbols;
procedure writetodisk;
protected
procedure writetodisk;override;
public
constructor createdjgpp(smart:boolean);
constructor createwin32(smart:boolean);
function initwriting(Aplace:tcutplace):tobjectdata;override;
end;
@ -146,44 +154,43 @@ implementation
TCoffSection
****************************************************************************}
constructor tcoffsection.initsec(sec:TSection;AAlign,AFlags:cardinal);
constructor tcoffsection.createsec(sec:TSection;AAlign,AFlags:cardinal);
begin
inherited init(target_asm.secnames[sec],AAlign,(sec=sec_bss));
inherited create(target_asm.secnames[sec],AAlign,(sec=sec_bss));
Flags:=AFlags;
end;
{****************************************************************************
TCoffOutput
TCoffData
****************************************************************************}
constructor tcoffoutput.initdjgpp(smart:boolean);
constructor tcoffdata.createdjgpp;
begin
inherited init(smart);
inherited create;
win32:=false;
reset;
end;
constructor tcoffoutput.initwin32(smart:boolean);
constructor tcoffdata.createwin32;
begin
inherited init(smart);
inherited create;
win32:=true;
reset;
end;
destructor tcoffoutput.done;
destructor tcoffdata.destroy;
begin
inherited done;
inherited destroy;
end;
procedure tcoffoutput.initwriting(Aplace:tcutplace);
procedure tcoffdata.reset;
var
s : string;
begin
inherited initwriting(Aplace);
{ reset }
initsym:=0;
new(syms,init(symbolresize));
new(strs,init(strsresize));
{ we need at least the following 3 sections }
@ -198,23 +205,12 @@ implementation
writestabs(sec_none,0,nil,0,0,0,false);
{ write zero pchar and name together (PM) }
s:=#0+SplitFileName(current_module^.mainsource^)+#0;
sects[sec_stabstr]^.write(s[1],length(s));
sects[sec_stabstr].write(s[1],length(s));
end;
end;
procedure tcoffoutput.donewriting;
begin
{ Only write the .o if there are no errors }
if errorcount=0 then
writetodisk;
dispose(syms,done);
dispose(strs,done);
inherited donewriting;
end;
procedure tcoffoutput.createsection(sec:TSection);
procedure tcoffdata.createsection(sec:TSection);
var
Flags,
AAlign : cardinal;
@ -263,11 +259,11 @@ implementation
Flags:=$c0300040;
end;
end;
sects[sec]:=new(PcoffSection,InitSec(Sec,AAlign,Flags));
sects[sec]:=tcoffSection.createsec(Sec,AAlign,Flags);
end;
procedure tcoffoutput.writesymbol(p:pasmsymbol);
procedure tcoffdata.writesymbol(p:pasmsymbol);
var
sym : toutputsymbol;
s : string;
@ -287,7 +283,7 @@ implementation
if sym.bind in [AB_LOCAL,AB_GLOBAL] then
begin
sym.section:=p^.section;
sym.value:=p^.address+sects[sym.section]^.mempos;
sym.value:=p^.address+sects[sym.section].mempos;
end;
{ store the symbol, but not the local ones }
if (sym.bind<>AB_LOCAL) then
@ -314,14 +310,10 @@ implementation
begin
p^.idx:=-2; { local }
end;
{ make the exported syms known to the objectwriter
(needed for .a generation) }
if (sym.bind in [AB_GLOBAL,AB_COMMON]) then
writer^.writesym(p^.name);
end;
procedure tcoffoutput.writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);
procedure tcoffdata.writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);
var
curraddr,
symaddr : longint;
@ -331,27 +323,27 @@ implementation
if assigned(p) then
begin
{ current address }
curraddr:=sects[currsec]^.mempos+sects[currsec]^.datasize;
curraddr:=sects[currsec].mempos+sects[currsec].datasize;
{ real address of the symbol }
symaddr:=p^.address;
if p^.section<>sec_none then
inc(symaddr,sects[p^.section]^.mempos);
inc(symaddr,sects[p^.section].mempos);
{ no symbol relocation need inside a section }
if p^.section=currsec then
begin
case relative of
relative_false :
begin
sects[currsec]^.addsectionreloc(curraddr,currsec,relative_false);
sects[currsec].addsectionreloc(curraddr,currsec,relative_false);
inc(data,symaddr);
end;
relative_true :
begin
inc(data,symaddr-len-sects[currsec]^.datasize);
inc(data,symaddr-len-sects[currsec].datasize);
end;
relative_rva :
begin
sects[currsec]^.addsectionreloc(curraddr,currsec,relative_rva);
sects[currsec].addsectionreloc(curraddr,currsec,relative_rva);
inc(data,symaddr);
end;
end;
@ -360,9 +352,9 @@ implementation
begin
writesymbol(p);
if (p^.section<>sec_none) and (relative<>relative_true) then
sects[currsec]^.addsectionreloc(curraddr,p^.section,relative)
sects[currsec].addsectionreloc(curraddr,p^.section,relative)
else
sects[currsec]^.addsymreloc(curraddr,p,relative);
sects[currsec].addsymreloc(curraddr,p,relative);
if not win32 then {seems wrong to me (PM) }
inc(data,symaddr)
else
@ -373,15 +365,15 @@ implementation
if win32 then
dec(data,len-4)
else
dec(data,len+sects[currsec]^.datasize);
dec(data,len+sects[currsec].datasize);
end;
end;
end;
sects[currsec]^.write(data,len);
sects[currsec].write(data,len);
end;
procedure tcoffoutput.writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc : boolean);
procedure tcoffdata.writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc : boolean);
var
stab : coffstab;
s : tsection;
@ -396,15 +388,15 @@ implementation
if s=sec_none then
offset:=0
else
offset:=sects[s]^.datasize;
offset:=sects[s].datasize;
end;
if (s<>sec_none) then
inc(offset,sects[s]^.datapos);
inc(offset,sects[s].datapos);
end;
if assigned(p) and (p[0]<>#0) then
begin
stab.strpos:=sects[sec_stabstr]^.datasize;
sects[sec_stabstr]^.write(p^,strlen(p)+1);
stab.strpos:=sects[sec_stabstr].datasize;
sects[sec_stabstr].write(p^,strlen(p)+1);
end
else
stab.strpos:=0;
@ -412,22 +404,24 @@ implementation
stab.ndesc:=line;
stab.nother:=nother;
stab.nvalue:=offset;
sects[sec_stab]^.write(stab,sizeof(stab));
sects[sec_stab].write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
{ current address }
curraddr:=sects[sec_stab]^.mempos+sects[sec_stab]^.datasize;
if reloc then
if DLLSource and RelocSection then
{ avoid relocation in the .stab section
because it ends up in the .reloc section instead }
sects[sec_stab]^.addsectionreloc(curraddr-4,s,relative_rva)
else
sects[sec_stab]^.addsectionreloc(curraddr-4,s,relative_false);
begin
{ current address }
curraddr:=sects[sec_stab].mempos+sects[sec_stab].datasize;
if DLLSource and RelocSection then
{ avoid relocation in the .stab section
because it ends up in the .reloc section instead }
sects[sec_stab].addsectionreloc(curraddr-4,s,relative_rva)
else
sects[sec_stab].addsectionreloc(curraddr-4,s,relative_false);
end;
end;
procedure tcoffoutput.writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
procedure tcoffdata.writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
nidx,nother,line:longint;reloc:boolean);
var
stab : coffstab;
@ -445,15 +439,15 @@ implementation
if section=sec_none then
offset:=0
else
offset:=sects[section]^.datasize;
offset:=sects[section].datasize;
end;
if (section<>sec_none) then
inc(offset,sects[section]^.mempos);
inc(offset,sects[section].mempos);
end;
if assigned(p) and (p[0]<>#0) then
begin
stab.strpos:=sects[sec_stabstr]^.datasize;
sects[sec_stabstr]^.write(p^,strlen(p)+1);
stab.strpos:=sects[sec_stabstr].datasize;
sects[sec_stabstr].write(p^,strlen(p)+1);
end
else
stab.strpos:=0;
@ -461,24 +455,24 @@ implementation
stab.ndesc:=line;
stab.nother:=nother;
stab.nvalue:=offset;
sects[sec_stab]^.write(stab,sizeof(stab));
sects[sec_stab].write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
{ current address }
curraddr:=sects[sec_stab]^.mempos+sects[sec_stab]^.datasize;
if reloc then
begin
{ current address }
curraddr:=sects[sec_stab].mempos+sects[sec_stab].datasize;
if DLLSource and RelocSection then
{ avoid relocation in the .stab section
because it ends up in the .reloc section instead }
sects[sec_stab]^.addsymreloc(curraddr-4,ps,relative_rva)
sects[sec_stab].addsymreloc(curraddr-4,ps,relative_rva)
else
sects[sec_stab]^.addsymreloc(curraddr-4,ps,relative_false);
sects[sec_stab].addsymreloc(curraddr-4,ps,relative_false);
end;
end;
procedure tcoffoutput.setsectionsizes(var s:tsecsize);
procedure tcoffdata.setsectionsizes(var s:tsecsize);
var
mempos : longint;
sec : tsection;
@ -500,35 +494,61 @@ implementation
createsection(sec);
if assigned(sects[sec]) then
begin
sects[sec]^.memsize:=s[sec];
sects[sec].memsize:=s[sec];
{ memory position }
if not win32 then
begin
sects[sec]^.mempos:=mempos;
inc(mempos,align(sects[sec]^.memsize,sects[sec]^.addralign));
sects[sec].mempos:=mempos;
inc(mempos,align(sects[sec].memsize,sects[sec].addralign));
end;
end;
end;
end;
{***********************************************
Writing to disk
***********************************************}
{****************************************************************************
TCoffOutput
****************************************************************************}
procedure tcoffoutput.write_relocs(s:poutputsection);
constructor tcoffoutput.createdjgpp(smart:boolean);
begin
inherited create(smart);
win32:=false;
end;
constructor tcoffoutput.createwin32(smart:boolean);
begin
inherited create(smart);
win32:=true;
end;
function tcoffoutput.initwriting(Aplace:tcutplace):tobjectdata;
begin
inherited initwriting(Aplace);
initsym:=0;
if win32 then
data:=tcoffdata.createwin32
else
data:=tcoffdata.createdjgpp;
initwriting:=data;
end;
procedure tcoffoutput.write_relocs(s:tobjectsection);
var
rel : coffreloc;
hr,r : poutputreloc;
begin
r:=s^.relochead;
r:=s.relochead;
while assigned(r) do
begin
rel.address:=r^.address;
if assigned(r^.symbol) then
begin
if (r^.symbol^.bind=AB_LOCAL) then
rel.sym:=2*sects[r^.symbol^.section]^.secsymidx
rel.sym:=2*data.sects[r^.symbol^.section].secsymidx
else
begin
if r^.symbol^.idx=-1 then
@ -539,7 +559,7 @@ implementation
else
begin
if r^.section<>sec_none then
rel.sym:=2*sects[r^.section]^.secsymidx
rel.sym:=2*data.sects[r^.section].secsymidx
else
rel.sym:=0;
end;
@ -548,7 +568,7 @@ implementation
relative_false : rel.relative:=$6;
relative_rva : rel.relative:=$7;
end;
writer^.write(rel,sizeof(rel));
writer.write(rel,sizeof(rel));
{ goto next and dispose this reloc }
hr:=r;
r:=r^.next;
@ -570,7 +590,7 @@ implementation
sym.section:=section;
sym.typ:=typ;
sym.aux:=aux;
writer^.write(sym,sizeof(sym));
writer.write(sym,sizeof(sym));
end;
@ -578,43 +598,45 @@ implementation
var
filename : string[18];
sec : tsection;
value,
sectionval,
i : longint;
globalval : byte;
secrec : coffsectionrec;
sym : toutputsymbol;
begin
{ The `.file' record, and the file name auxiliary record }
write_symbol ('.file', -1, 0, -2, $67, 1);
fillchar(filename,sizeof(filename),0);
filename:=SplitFileName(current_module^.mainsource^);
writer^.write(filename[1],sizeof(filename)-1);
{ The section records, with their auxiliaries, also store the
symbol index }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
write_symbol(target_asm.secnames[sec],-1,sects[sec]^.mempos,sects[sec]^.secsymidx,3,1);
fillchar(secrec,sizeof(secrec),0);
secrec.len:=sects[sec]^.aligneddatasize;
secrec.nrelocs:=sects[sec]^.nrelocs;
writer^.write(secrec,sizeof(secrec));
end;
{ The real symbols }
syms^.seek(0);
for i:=1 to syms^.size div sizeof(TOutputSymbol) do
with tcoffdata(data) do
begin
syms^.read(sym,sizeof(TOutputSymbol));
if sym.bind=AB_LOCAL then
globalval:=3
else
globalval:=2;
if assigned(sects[sym.section]) then
sectionval:=sects[sym.section]^.secsymidx
else
sectionval:=0;
write_symbol(sym.namestr,sym.nameidx,sym.value,sectionval,globalval,0);
{ The `.file' record, and the file name auxiliary record }
write_symbol ('.file', -1, 0, -2, $67, 1);
fillchar(filename,sizeof(filename),0);
filename:=SplitFileName(current_module^.mainsource^);
writer.write(filename[1],sizeof(filename)-1);
{ The section records, with their auxiliaries, also store the
symbol index }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
write_symbol(target_asm.secnames[sec],-1,sects[sec].mempos,sects[sec].secsymidx,3,1);
fillchar(secrec,sizeof(secrec),0);
secrec.len:=sects[sec].aligneddatasize;
secrec.nrelocs:=sects[sec].nrelocs;
writer.write(secrec,sizeof(secrec));
end;
{ The real symbols }
syms^.seek(0);
for i:=1 to syms^.size div sizeof(TOutputSymbol) do
begin
syms^.read(sym,sizeof(TOutputSymbol));
if sym.bind=AB_LOCAL then
globalval:=3
else
globalval:=2;
if assigned(sects[sym.section]) then
sectionval:=sects[sym.section].secsymidx
else
sectionval:=0;
write_symbol(sym.namestr,sym.nameidx,sym.value,sectionval,globalval,0);
end;
end;
end;
@ -633,122 +655,134 @@ implementation
empty : array[0..15] of byte;
hp : pdynamicblock;
begin
{ calc amount of sections we have }
fillchar(empty,sizeof(empty),0);
nsects:=0;
initsym:=2; { 2 for the file }
secsymidx:=0;
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
inc(nsects);
inc(secsymidx);
sects[sec]^.secsymidx:=secsymidx;
inc(initsym,2); { 2 for each section }
end;
{ For the stab section we need an HdrSym which can now be
calculated more easily }
if assigned(sects[sec_stab]) then
with tcoffdata(data) do
begin
hstab.strpos:=1;
hstab.ntype:=0;
hstab.nother:=0;
hstab.ndesc:=(sects[sec_stab]^.datasize div sizeof(coffstab))-1{+1 according to gas output PM};
hstab.nvalue:=sects[sec_stabstr]^.datasize;
sects[sec_stab]^.data^.seek(0);
sects[sec_stab]^.data^.write(hstab,sizeof(hstab));
end;
{ Calculate the filepositions }
datapos:=sizeof(coffheader)+sizeof(coffsechdr)*nsects;
{ sections first }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
sects[sec]^.datapos:=datapos;
if assigned(sects[sec]^.data) then
inc(datapos,sects[sec]^.aligneddatasize);
end;
{ relocs }
gotreloc:=false;
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
PCoffSection(sects[sec])^.relocpos:=datapos;
inc(datapos,10*sects[sec]^.nrelocs);
if (not gotreloc) and (sects[sec]^.nrelocs>0) then
gotreloc:=true;
end;
{ symbols }
sympos:=datapos;
{ COFF header }
fillchar(header,sizeof(coffheader),0);
header.mach:=$14c;
header.nsects:=nsects;
header.sympos:=sympos;
header.syms:=(syms^.size div sizeof(TOutputSymbol))+initsym;
if gotreloc then
header.flag:=$104
else
header.flag:=$105;
writer^.write(header,sizeof(header));
{ Section headers }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
fillchar(sechdr,sizeof(sechdr),0);
move(target_asm.secnames[sec][1],sechdr.name,length(target_asm.secnames[sec]));
if not win32 then
begin
sechdr.rvaofs:=sects[sec]^.mempos;
sechdr.vsize:=sects[sec]^.mempos;
end
else
begin
if sec=sec_bss then
sechdr.vsize:=sects[sec]^.aligneddatasize;
end;
sechdr.datasize:=sects[sec]^.aligneddatasize;
if (sects[sec]^.datasize>0) and assigned(sects[sec]^.data) then
sechdr.datapos:=sects[sec]^.datapos;
sechdr.nrelocs:=sects[sec]^.nrelocs;
sechdr.relocpos:=PCoffSection(sects[sec])^.relocpos;
sechdr.flags:=PCoffSection(sects[sec])^.flags;
writer^.write(sechdr,sizeof(sechdr));
end;
{ Sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(sects[sec]^.data) then
begin
sects[sec]^.alignsection;
hp:=sects[sec]^.data^.firstblock;
while assigned(hp) do
{ calc amount of sections we have }
fillchar(empty,sizeof(empty),0);
nsects:=0;
initsym:=2; { 2 for the file }
secsymidx:=0;
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
writer^.write(hp^.data,hp^.used);
hp:=hp^.next;
inc(nsects);
inc(secsymidx);
sects[sec].secsymidx:=secsymidx;
inc(initsym,2); { 2 for each section }
end;
end;
{ Relocs }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
write_relocs(sects[sec]);
{ Symbols }
write_symbols;
{ Strings }
i:=strs^.size+4;
writer^.write(i,4);
hp:=strs^.firstblock;
while assigned(hp) do
begin
writer^.write(hp^.data,hp^.used);
hp:=hp^.next;
{ For the stab section we need an HdrSym which can now be
calculated more easily }
if assigned(sects[sec_stab]) then
begin
hstab.strpos:=1;
hstab.ntype:=0;
hstab.nother:=0;
hstab.ndesc:=(sects[sec_stab].datasize div sizeof(coffstab))-1{+1 according to gas output PM};
hstab.nvalue:=sects[sec_stabstr].datasize;
sects[sec_stab].data^.seek(0);
sects[sec_stab].data^.write(hstab,sizeof(hstab));
end;
{ Calculate the filepositions }
datapos:=sizeof(coffheader)+sizeof(coffsechdr)*nsects;
{ sections first }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
sects[sec].datapos:=datapos;
if assigned(sects[sec].data) then
inc(datapos,sects[sec].aligneddatasize);
end;
{ relocs }
gotreloc:=false;
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
tcoffsection(sects[sec]).relocpos:=datapos;
inc(datapos,10*sects[sec].nrelocs);
if (not gotreloc) and (sects[sec].nrelocs>0) then
gotreloc:=true;
end;
{ symbols }
sympos:=datapos;
{ COFF header }
fillchar(header,sizeof(coffheader),0);
header.mach:=$14c;
header.nsects:=nsects;
header.sympos:=sympos;
header.syms:=(syms^.size div sizeof(TOutputSymbol))+initsym;
if gotreloc then
header.flag:=$104
else
header.flag:=$105;
writer.write(header,sizeof(header));
{ Section headers }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
fillchar(sechdr,sizeof(sechdr),0);
move(target_asm.secnames[sec][1],sechdr.name,length(target_asm.secnames[sec]));
if not win32 then
begin
sechdr.rvaofs:=sects[sec].mempos;
sechdr.vsize:=sects[sec].mempos;
end
else
begin
if sec=sec_bss then
sechdr.vsize:=sects[sec].aligneddatasize;
end;
sechdr.datasize:=sects[sec].aligneddatasize;
if (sects[sec].datasize>0) and assigned(sects[sec].data) then
sechdr.datapos:=sects[sec].datapos;
sechdr.nrelocs:=sects[sec].nrelocs;
sechdr.relocpos:=TCoffSection(sects[sec]).relocpos;
sechdr.flags:=TCoffSection(sects[sec]).flags;
writer.write(sechdr,sizeof(sechdr));
end;
{ Sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(sects[sec].data) then
begin
sects[sec].alignsection;
hp:=sects[sec].data^.firstblock;
while assigned(hp) do
begin
writer.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
end;
{ Relocs }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
write_relocs(sects[sec]);
{ Symbols }
write_symbols;
{ Strings }
i:=strs^.size+4;
writer.write(i,4);
hp:=strs^.firstblock;
while assigned(hp) do
begin
writer.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
end;
end;
{****************************************************************************
TCoffInput
****************************************************************************}
end.
{
$Log$
Revision 1.5 2000-12-21 12:06:38 jonas
Revision 1.6 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.5 2000/12/21 12:06:38 jonas
* changed type of all "flags" variables/parameters/fields to cardinal
and removed longint typecasts around constants

View File

@ -41,8 +41,8 @@ interface
ogbase;
type
pelf32section = ^telf32section;
telf32section = object(toutputsection)
telf32section = class(tobjectsection)
public
secshidx : longint; { index for the section in symtab }
shstridx,
shtype,
@ -51,14 +51,14 @@ interface
shinfo,
entsize : longint;
{ relocation }
relocsect : PElf32Section;
constructor initsec(sec:TSection);
constructor initname(const Aname:string;Atype,Aflags,Alink,Ainfo,Aalign,Aentsize:longint);
destructor done;
relocsect : telf32Section;
constructor createsec(sec:TSection);
constructor createname(const Aname:string;Atype,Aflags,Alink,Ainfo,Aalign,Aentsize:longint);
destructor destroy;override;
end;
pelf32output = ^telf32output;
telf32output = object(tobjectoutput)
telf32data = class(tobjectdata)
public
symtabsect,
strtabsect,
shstrtabsect,
@ -66,31 +66,35 @@ interface
gotoffsect,
gotsect,
pltsect,
symsect : pelf32Section;
symsect : telf32Section;
strs,
syms : Pdynamicarray;
initsym : longint;
constructor init(smart:boolean);
destructor done;virtual;
procedure initwriting(Aplace:tcutplace);virtual;
procedure donewriting;virtual;
procedure createsection(sec:tsection);virtual;
procedure setsectionsizes(var s:tsecsize);virtual;
procedure writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);virtual;
procedure writesymbol(p:pasmsymbol);virtual;
procedure writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc:boolean);virtual;
constructor create;
destructor destroy;override;
procedure createsection(sec:tsection);override;
procedure setsectionsizes(var s:tsecsize);override;
procedure writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);override;
procedure writesymbol(p:pasmsymbol);override;
procedure writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc:boolean);override;
procedure writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
nidx,nother,line:longint;reloc:boolean);virtual;
nidx,nother,line:longint;reloc:boolean);override;
end;
telf32output = class(tobjectoutput)
private
procedure createrelocsection(s:pelf32section);
initsym : longint;
procedure createrelocsection(s:telf32section);
procedure createshstrtab;
procedure createsymtab;
procedure writesectionheader(s:pelf32section);
procedure writetodisk;
procedure writesectionheader(s:telf32section);
protected
procedure writetodisk;override;
public
function initwriting(Aplace:tcutplace):tobjectdata;override;
end;
implementation
implementation
uses
{$ifdef delphi}
@ -207,7 +211,7 @@ interface
TSection
****************************************************************************}
constructor telf32section.initsec(sec:TSection);
constructor telf32section.createsec(sec:TSection);
var
Aflags,Atype,Aalign,Aentsize : longint;
begin
@ -246,13 +250,13 @@ interface
AAlign:=1;
end;
end;
initname(target_asm.secnames[sec],Atype,Aflags,0,0,Aalign,Aentsize);
createname(target_asm.secnames[sec],Atype,Aflags,0,0,Aalign,Aentsize);
end;
constructor telf32section.initname(const Aname:string;Atype,Aflags,Alink,Ainfo,Aalign,Aentsize:longint);
constructor telf32section.createname(const Aname:string;Atype,Aflags,Alink,Ainfo,Aalign,Aentsize:longint);
begin
inherited init(Aname,Aalign,(AType=SHT_NOBITS));
inherited create(Aname,Aalign,(AType=SHT_NOBITS));
secshidx:=0;
shstridx:=0;
shtype:=AType;
@ -264,45 +268,32 @@ interface
end;
destructor telf32section.done;
destructor telf32section.destroy;
begin
if assigned(relocsect) then
dispose(relocsect,done);
inherited done;
relocsect.free;
inherited destroy;
end;
{****************************************************************************
TElf32Output
TElf32Data
****************************************************************************}
constructor telf32output.init(smart:boolean);
begin
inherited init(smart);
end;
destructor telf32output.done;
begin
inherited done;
end;
procedure telf32output.initwriting(Aplace:tcutplace);
constructor telf32data.create;
var
s : string;
begin
inherited initwriting(Aplace);
inherited create;
{ reset }
initsym:=0;
new(syms,init(symbolresize));
{ default sections }
new(symtabsect,initname('.symtab',2,0,0,0,4,16));
new(strtabsect,initname('.strtab',3,0,0,0,1,0));
new(shstrtabsect,initname('.shstrtab',3,0,0,0,1,0));
symtabsect:=telf32section.createname('.symtab',2,0,0,0,4,16);
strtabsect:=telf32section.createname('.strtab',3,0,0,0,1,0);
shstrtabsect:=telf32section.createname('.shstrtab',3,0,0,0,1,0);
{ insert the empty and filename as first in strtab }
strtabsect^.writestr(#0);
strtabsect^.writestr(SplitFileName(current_module^.mainsource^)+#0);
strtabsect.writestr(#0);
strtabsect.writestr(SplitFileName(current_module^.mainsource^)+#0);
{ we need at least the following sections }
createsection(sec_code);
createsection(sec_data);
@ -315,30 +306,28 @@ interface
writestabs(sec_none,0,nil,0,0,0,false);
{ write zero pchar and name together (PM) }
s:=#0+SplitFileName(current_module^.mainsource^)+#0;
sects[sec_stabstr]^.write(s[1],length(s));
sects[sec_stabstr].write(s[1],length(s));
end;
end;
procedure telf32output.donewriting;
destructor telf32data.destroy;
begin
writetodisk;
{ free memory }
dispose(syms,done);
dispose(symtabsect,done);
dispose(strtabsect,done);
dispose(shstrtabsect,done);
inherited donewriting;
symtabsect.free;
strtabsect.free;
shstrtabsect.free;
inherited destroy;
end;
procedure telf32output.createsection(sec:tsection);
procedure telf32data.createsection(sec:tsection);
begin
sects[sec]:=new(pelf32Section,initsec(Sec))
sects[sec]:=telf32Section.createsec(Sec);
end;
procedure telf32output.writesymbol(p:pasmsymbol);
procedure telf32data.writesymbol(p:pasmsymbol);
var
sym : toutputsymbol;
begin
@ -370,9 +359,9 @@ interface
if (sym.bind<>AB_LOCAL) then
begin
{ symbolname, write the #0 separate to overcome 255+1 char not possible }
sym.nameidx:=strtabsect^.datasize;
strtabsect^.writestr(p^.name);
strtabsect^.writestr(#0);
sym.nameidx:=strtabsect.datasize;
strtabsect.writestr(p^.name);
strtabsect.writestr(#0);
{ update the asmsymbol index }
p^.idx:=syms^.size div sizeof(toutputsymbol);
{ symbol }
@ -382,14 +371,10 @@ interface
begin
p^.idx:=-2; { local }
end;
{ make the exported syms known to the objectwriter
(needed for .a generation) }
if (sym.bind in [AB_GLOBAL,AB_COMMON]) then
writer^.writesym(p^.name);
end;
procedure telf32output.writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);
procedure telf32data.writereloc(data,len:longint;p:pasmsymbol;relative:relative_type);
var
symaddr : longint;
begin
@ -405,12 +390,12 @@ interface
case relative of
relative_false :
begin
sects[currsec]^.addsectionreloc(sects[currsec]^.datasize,currsec,relative_false);
sects[currsec].addsectionreloc(sects[currsec].datasize,currsec,relative_false);
inc(data,symaddr);
end;
relative_true :
begin
inc(data,symaddr-len-sects[currsec]^.datasize);
inc(data,symaddr-len-sects[currsec].datasize);
end;
relative_rva :
internalerror(3219583);
@ -421,25 +406,25 @@ interface
writesymbol(p);
if (p^.section<>sec_none) and (relative<>relative_true) then
begin
sects[currsec]^.addsectionreloc(sects[currsec]^.datasize,p^.section,relative);
sects[currsec].addsectionreloc(sects[currsec].datasize,p^.section,relative);
inc(data,symaddr);
end
else
sects[currsec]^.addsymreloc(sects[currsec]^.datasize,p,relative);
sects[currsec].addsymreloc(sects[currsec].datasize,p,relative);
if relative=relative_true then
begin
if p^.bind=AB_EXTERNAL then
dec(data,len)
else
dec(data,len+sects[currsec]^.datasize);
dec(data,len+sects[currsec].datasize);
end;
end;
end;
sects[currsec]^.write(data,len);
sects[currsec].write(data,len);
end;
procedure telf32output.writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc : boolean);
procedure telf32data.writestabs(section:tsection;offset:longint;p:pchar;nidx,nother,line:longint;reloc : boolean);
var
stab : telf32stab;
s : tsection;
@ -452,28 +437,28 @@ interface
if s=sec_none then
offset:=0
else
offset:=sects[s]^.datasize;
offset:=sects[s].datasize;
end;
end;
fillchar(stab,sizeof(telf32stab),0);
if assigned(p) and (p[0]<>#0) then
begin
stab.strpos:=sects[sec_stabstr]^.datasize;
sects[sec_stabstr]^.write(p^,strlen(p)+1);
stab.strpos:=sects[sec_stabstr].datasize;
sects[sec_stabstr].write(p^,strlen(p)+1);
end;
stab.ntype:=nidx;
stab.ndesc:=line;
stab.nother:=nother;
stab.nvalue:=offset;
sects[sec_stab]^.write(stab,sizeof(stab));
sects[sec_stab].write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
if reloc then
sects[sec_stab]^.addsectionreloc(sects[sec_stab]^.datasize-4,s,relative_false);
sects[sec_stab].addsectionreloc(sects[sec_stab].datasize-4,s,relative_false);
end;
procedure telf32output.writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
procedure telf32data.writesymstabs(section:tsection;offset:longint;p:pchar;ps:pasmsymbol;
nidx,nother,line:longint;reloc:boolean);
var
stab : telf32stab;
@ -485,78 +470,90 @@ interface
if section=sec_none then
offset:=0
else
offset:=sects[section]^.datasize;
offset:=sects[section].datasize;
end;
end;
fillchar(stab,sizeof(telf32stab),0);
if assigned(p) and (p[0]<>#0) then
begin
stab.strpos:=sects[sec_stabstr]^.datasize;
sects[sec_stabstr]^.write(p^,strlen(p)+1);
stab.strpos:=sects[sec_stabstr].datasize;
sects[sec_stabstr].write(p^,strlen(p)+1);
end;
stab.ntype:=nidx;
stab.ndesc:=line;
stab.nother:=nother;
stab.nvalue:=offset;
sects[sec_stab]^.write(stab,sizeof(stab));
sects[sec_stab].write(stab,sizeof(stab));
{ when the offset is not 0 then write a relocation, take also the
hdrstab into account with the offset }
if reloc then
sects[sec_stab]^.addsymreloc(sects[sec_stab]^.datasize-4,ps,relative_false);
sects[sec_stab].addsymreloc(sects[sec_stab].datasize-4,ps,relative_false);
end;
procedure telf32output.setsectionsizes(var s:tsecsize);
procedure telf32data.setsectionsizes(var s:tsecsize);
begin
end;
{***********************************************
Writing to disk
***********************************************}
{****************************************************************************
TElf32Output
****************************************************************************}
procedure telf32output.createrelocsection(s:pelf32section);
function telf32output.initwriting(Aplace:tcutplace):tobjectdata;
begin
inherited initwriting(Aplace);
initsym:=0;
data:=telf32data.create;
initwriting:=data;
end;
procedure telf32output.createrelocsection(s:telf32section);
var
rel : telf32reloc;
hr,r : poutputreloc;
relsym,reltyp : longint;
begin
{ create the reloc section }
new(s^.relocsect,initname('.rel'+s^.name,9,0,symtabsect^.secshidx,s^.secshidx,4,8));
{ add the relocations }
r:=s^.relochead;
while assigned(r) do
with telf32data(data) do
begin
rel.address:=r^.address;
if assigned(r^.symbol) then
{ create the reloc section }
s.relocsect:=telf32section.createname('.rel'+s.name,9,0,symtabsect.secshidx,s.secshidx,4,8);
{ add the relocations }
r:=s.relochead;
while assigned(r) do
begin
if (r^.symbol^.bind=AB_LOCAL) then
relsym:=sects[r^.symbol^.section]^.secsymidx
else
rel.address:=r^.address;
if assigned(r^.symbol) then
begin
if r^.symbol^.idx=-1 then
internalerror(4321);
relsym:=(r^.symbol^.idx+initsym);
end;
end
else
if r^.section<>sec_none then
relsym:=sects[r^.section]^.secsymidx
else
relsym:=SHN_UNDEF;
case r^.typ of
relative_true :
reltyp:=R_386_PC32;
relative_false :
reltyp:=R_386_32;
end;
rel.info:=(relsym shl 8) or reltyp;
{ write reloc }
s^.relocsect^.write(rel,sizeof(rel));
{ goto next and dispose this reloc }
hr:=r;
r:=r^.next;
dispose(hr);
if (r^.symbol^.bind=AB_LOCAL) then
relsym:=sects[r^.symbol^.section].secsymidx
else
begin
if r^.symbol^.idx=-1 then
internalerror(4321);
relsym:=(r^.symbol^.idx+initsym);
end;
end
else
if r^.section<>sec_none then
relsym:=sects[r^.section].secsymidx
else
relsym:=SHN_UNDEF;
case r^.typ of
relative_true :
reltyp:=R_386_PC32;
relative_false :
reltyp:=R_386_32;
end;
rel.info:=(relsym shl 8) or reltyp;
{ write reloc }
s.relocsect.write(rel,sizeof(rel));
{ goto next and dispose this reloc }
hr:=r;
r:=r^.next;
dispose(hr);
end;
end;
end;
@ -569,67 +566,70 @@ interface
locals,
i : longint;
begin
locals:=2;
{ empty entry }
fillchar(elfsym,sizeof(elfsym),0);
symtabsect^.write(elfsym,sizeof(elfsym));
{ filename entry }
elfsym.st_name:=1;
elfsym.st_info:=STT_FILE;
elfsym.st_shndx:=SHN_ABS;
symtabsect^.write(elfsym,sizeof(elfsym));
{ section }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
fillchar(elfsym,sizeof(elfsym),0);
elfsym.st_name:=pelf32section(sects[sec])^.shstridx;
elfsym.st_info:=STT_SECTION;
elfsym.st_shndx:=pelf32section(sects[sec])^.secshidx;
symtabsect^.write(elfsym,sizeof(elfsym));
inc(locals);
end;
{ symbols }
syms^.seek(0);
for i:=1 to (syms^.size div sizeof(toutputsymbol)) do
with telf32data(data) do
begin
syms^.read(sym,sizeof(toutputsymbol));
locals:=2;
{ empty entry }
fillchar(elfsym,sizeof(elfsym),0);
elfsym.st_name:=sym.nameidx;
elfsym.st_value:=sym.value;
elfsym.st_size:=sym.size;
case sym.bind of
AB_LOCAL :
begin
elfsym.st_info:=STB_LOCAL shl 4;
inc(locals);
end;
AB_COMMON,
AB_EXTERNAL,
AB_GLOBAL :
elfsym.st_info:=STB_GLOBAL shl 4;
end;
if sym.bind<>AB_EXTERNAL then
symtabsect.write(elfsym,sizeof(elfsym));
{ filename entry }
elfsym.st_name:=1;
elfsym.st_info:=STT_FILE;
elfsym.st_shndx:=SHN_ABS;
symtabsect.write(elfsym,sizeof(elfsym));
{ section }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
fillchar(elfsym,sizeof(elfsym),0);
elfsym.st_name:=telf32section(sects[sec]).shstridx;
elfsym.st_info:=STT_SECTION;
elfsym.st_shndx:=telf32section(sects[sec]).secshidx;
symtabsect.write(elfsym,sizeof(elfsym));
inc(locals);
end;
{ symbols }
syms^.seek(0);
for i:=1 to (syms^.size div sizeof(toutputsymbol)) do
begin
case sym.typ of
AT_FUNCTION :
elfsym.st_info:=elfsym.st_info or STT_FUNC;
AT_DATA :
elfsym.st_info:=elfsym.st_info or STT_OBJECT;
syms^.read(sym,sizeof(toutputsymbol));
fillchar(elfsym,sizeof(elfsym),0);
elfsym.st_name:=sym.nameidx;
elfsym.st_value:=sym.value;
elfsym.st_size:=sym.size;
case sym.bind of
AB_LOCAL :
begin
elfsym.st_info:=STB_LOCAL shl 4;
inc(locals);
end;
AB_COMMON,
AB_EXTERNAL,
AB_GLOBAL :
elfsym.st_info:=STB_GLOBAL shl 4;
end;
if sym.bind<>AB_EXTERNAL then
begin
case sym.typ of
AT_FUNCTION :
elfsym.st_info:=elfsym.st_info or STT_FUNC;
AT_DATA :
elfsym.st_info:=elfsym.st_info or STT_OBJECT;
end;
end;
if sym.bind=AB_COMMON then
elfsym.st_shndx:=SHN_COMMON
else
if assigned(sects[sym.section]) then
elfsym.st_shndx:=telf32section(sects[sym.section]).secshidx
else
elfsym.st_shndx:=SHN_UNDEF;
symtabsect.write(elfsym,sizeof(elfsym));
end;
if sym.bind=AB_COMMON then
elfsym.st_shndx:=SHN_COMMON
else
if assigned(sects[sym.section]) then
elfsym.st_shndx:=pelf32section(sects[sym.section])^.secshidx
else
elfsym.st_shndx:=SHN_UNDEF;
symtabsect^.write(elfsym,sizeof(elfsym));
{ update the .symtab section header }
symtabsect.shlink:=strtabsect.secshidx;
symtabsect.shinfo:=locals;
end;
{ update the .symtab section header }
symtabsect^.shlink:=strtabsect^.secshidx;
symtabsect^.shinfo:=locals;
end;
@ -637,38 +637,41 @@ interface
var
sec : tsection;
begin
with shstrtabsect^ do
with telf32data(data) do
begin
writestr(#0);
symtabsect^.shstridx:=writestr('.symtab'#0);
strtabsect^.shstridx:=writestr('.strtab'#0);
shstrtabsect^.shstridx:=writestr('.shstrtab'#0);
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
pelf32section(sects[sec])^.shstridx:=writestr(sects[sec]^.name+#0);
if assigned(pelf32section(sects[sec])^.relocsect) then
pelf32section(sects[sec])^.relocsect^.shstridx:=writestr(pelf32section(sects[sec])^.relocsect^.name+#0);
end;
with shstrtabsect do
begin
writestr(#0);
symtabsect.shstridx:=writestr('.symtab'#0);
strtabsect.shstridx:=writestr('.strtab'#0);
shstrtabsect.shstridx:=writestr('.shstrtab'#0);
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
telf32section(sects[sec]).shstridx:=writestr(sects[sec].name+#0);
if assigned(telf32section(sects[sec]).relocsect) then
telf32section(sects[sec]).relocsect.shstridx:=writestr(telf32section(sects[sec]).relocsect.name+#0);
end;
end;
end;
end;
procedure telf32output.writesectionheader(s:pelf32section);
procedure telf32output.writesectionheader(s:telf32section);
var
sechdr : telf32sechdr;
begin
fillchar(sechdr,sizeof(sechdr),0);
sechdr.sh_name:=s^.shstridx;
sechdr.sh_type:=s^.shtype;
sechdr.sh_flags:=s^.shflags;
sechdr.sh_offset:=s^.datapos;
sechdr.sh_size:=s^.datasize;
sechdr.sh_link:=s^.shlink;
sechdr.sh_info:=s^.shinfo;
sechdr.sh_addralign:=s^.addralign;
sechdr.sh_entsize:=s^.entsize;
writer^.write(sechdr,sizeof(sechdr));
sechdr.sh_name:=s.shstridx;
sechdr.sh_type:=s.shtype;
sechdr.sh_flags:=s.shflags;
sechdr.sh_offset:=s.datapos;
sechdr.sh_size:=s.datasize;
sechdr.sh_link:=s.shlink;
sechdr.sh_info:=s.shinfo;
sechdr.sh_addralign:=s.addralign;
sechdr.sh_entsize:=s.entsize;
writer.write(sechdr,sizeof(sechdr));
end;
@ -683,165 +686,171 @@ interface
empty : array[0..63] of byte;
hp : pdynamicblock;
begin
{ calc amount of sections we have }
fillchar(empty,sizeof(empty),0);
nsects:=1;
initsym:=2;
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
{ each section requires a symbol for relocation }
sects[sec]^.secsymidx:=initsym;
inc(initsym);
{ also create the index in the section header table }
pelf32section(sects[sec])^.secshidx:=nsects;
inc(nsects);
if assigned(sects[sec]^.relochead) then
inc(nsects);
end;
{ add default sections follows }
shstrtabsect^.secshidx:=nsects;
inc(nsects);
symtabsect^.secshidx:=nsects;
inc(nsects);
strtabsect^.secshidx:=nsects;
inc(nsects);
{ For the stab section we need an HdrSym which can now be
calculated more easily }
if assigned(sects[sec_stab]) then
with telf32data(data) do
begin
hstab.strpos:=1;
hstab.ntype:=0;
hstab.nother:=0;
hstab.ndesc:=(sects[sec_stab]^.datasize div sizeof(telf32stab))-1{+1 according to gas output PM};
hstab.nvalue:=sects[sec_stabstr]^.datasize;
sects[sec_stab]^.data^.seek(0);
sects[sec_stab]^.data^.write(hstab,sizeof(hstab));
end;
{ Create the relocation sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
(sects[sec]^.nrelocs>0) then
createrelocsection(pelf32section(sects[sec]));
{ create .symtab }
createsymtab;
{ create .shstrtab }
createshstrtab;
{ Calculate the filepositions }
datapos:=$40; { elfheader + alignment }
{ sections first }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
sects[sec]^.datapos:=datapos;
if assigned(sects[sec]^.data) then
inc(datapos,sects[sec]^.aligneddatasize);
end;
{ shstrtab }
shstrtabsect^.datapos:=datapos;
inc(datapos,shstrtabsect^.aligneddatasize);
{ section headers }
shoffset:=datapos;
inc(datapos,nsects*sizeof(telf32sechdr));
{ symtab }
symtabsect^.datapos:=datapos;
inc(datapos,symtabsect^.aligneddatasize);
{ strtab }
strtabsect^.datapos:=datapos;
inc(datapos,align(strtabsect^.datasize,4));
{ .rel sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(pelf32section(sects[sec])^.relocsect) then
begin
pelf32section(sects[sec])^.relocsect^.datapos:=datapos;
inc(datapos,pelf32section(sects[sec])^.relocsect^.aligneddatasize);
end;
{ Write ELF Header }
fillchar(header,sizeof(header),0);
header.magic0123:=$464c457f; { = #127'ELF' }
header.file_class:=1;
header.data_encoding:=1;
header.file_version:=1;
header.e_type:=1;
header.e_machine:=3;
header.e_version:=1;
header.e_shoff:=shoffset;
header.e_shstrndx:=shstrtabsect^.secshidx;
header.e_shnum:=nsects;
header.e_ehsize:=sizeof(telf32header);
header.e_shentsize:=sizeof(telf32sechdr);
writer^.write(header,sizeof(header));
writer^.write(empty,$40-sizeof(header)); { align }
{ Sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(sects[sec]^.data) then
begin
sects[sec]^.alignsection;
hp:=sects[sec]^.data^.firstblock;
while assigned(hp) do
{ calc amount of sections we have }
fillchar(empty,sizeof(empty),0);
nsects:=1;
initsym:=2;
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
writer^.write(hp^.data,hp^.used);
hp:=hp^.next;
{ each section requires a symbol for relocation }
sects[sec].secsymidx:=initsym;
inc(initsym);
{ also create the index in the section header table }
telf32section(sects[sec]).secshidx:=nsects;
inc(nsects);
if assigned(sects[sec].relochead) then
inc(nsects);
end;
end;
{ .shstrtab }
shstrtabsect^.alignsection;
hp:=shstrtabsect^.data^.firstblock;
while assigned(hp) do
begin
writer^.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
{ section headers, start with an empty header for sh_undef }
writer^.write(empty,sizeof(telf32sechdr));
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
writesectionheader(pelf32section(sects[sec]));
if assigned(pelf32section(sects[sec])^.relocsect) then
writesectionheader(pelf32section(sects[sec])^.relocsect);
end;
writesectionheader(shstrtabsect);
writesectionheader(symtabsect);
writesectionheader(strtabsect);
{ .symtab }
symtabsect^.alignsection;
hp:=symtabsect^.data^.firstblock;
while assigned(hp) do
begin
writer^.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
{ .strtab }
strtabsect^.writealign(4);
hp:=strtabsect^.data^.firstblock;
while assigned(hp) do
begin
writer^.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
{ .rel sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(pelf32section(sects[sec])^.relocsect) then
begin
pelf32section(sects[sec])^.relocsect^.alignsection;
hp:=pelf32section(sects[sec])^.relocsect^.data^.firstblock;
while assigned(hp) do
{ add default sections follows }
shstrtabsect.secshidx:=nsects;
inc(nsects);
symtabsect.secshidx:=nsects;
inc(nsects);
strtabsect.secshidx:=nsects;
inc(nsects);
{ For the stab section we need an HdrSym which can now be
calculated more easily }
if assigned(sects[sec_stab]) then
begin
hstab.strpos:=1;
hstab.ntype:=0;
hstab.nother:=0;
hstab.ndesc:=(sects[sec_stab].datasize div sizeof(telf32stab))-1{+1 according to gas output PM};
hstab.nvalue:=sects[sec_stabstr].datasize;
sects[sec_stab].data^.seek(0);
sects[sec_stab].data^.write(hstab,sizeof(hstab));
end;
{ Create the relocation sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
(sects[sec].nrelocs>0) then
createrelocsection(telf32section(sects[sec]));
{ create .symtab }
createsymtab;
{ create .shstrtab }
createshstrtab;
{ Calculate the filepositions }
datapos:=$40; { elfheader + alignment }
{ sections first }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
writer^.write(hp^.data,hp^.used);
hp:=hp^.next;
sects[sec].datapos:=datapos;
if assigned(sects[sec].data) then
inc(datapos,sects[sec].aligneddatasize);
end;
end;
{ shstrtab }
shstrtabsect.datapos:=datapos;
inc(datapos,shstrtabsect.aligneddatasize);
{ section headers }
shoffset:=datapos;
inc(datapos,nsects*sizeof(telf32sechdr));
{ symtab }
symtabsect.datapos:=datapos;
inc(datapos,symtabsect.aligneddatasize);
{ strtab }
strtabsect.datapos:=datapos;
inc(datapos,align(strtabsect.datasize,4));
{ .rel sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(telf32section(sects[sec]).relocsect) then
begin
telf32section(sects[sec]).relocsect.datapos:=datapos;
inc(datapos,telf32section(sects[sec]).relocsect.aligneddatasize);
end;
{ Write ELF Header }
fillchar(header,sizeof(header),0);
header.magic0123:=$464c457f; { = #127'ELF' }
header.file_class:=1;
header.data_encoding:=1;
header.file_version:=1;
header.e_type:=1;
header.e_machine:=3;
header.e_version:=1;
header.e_shoff:=shoffset;
header.e_shstrndx:=shstrtabsect.secshidx;
header.e_shnum:=nsects;
header.e_ehsize:=sizeof(telf32header);
header.e_shentsize:=sizeof(telf32sechdr);
writer.write(header,sizeof(header));
writer.write(empty,$40-sizeof(header)); { align }
{ Sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(sects[sec].data) then
begin
sects[sec].alignsection;
hp:=sects[sec].data^.firstblock;
while assigned(hp) do
begin
writer.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
end;
{ .shstrtab }
shstrtabsect.alignsection;
hp:=shstrtabsect.data^.firstblock;
while assigned(hp) do
begin
writer.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
{ section headers, start with an empty header for sh_undef }
writer.write(empty,sizeof(telf32sechdr));
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) then
begin
writesectionheader(telf32section(sects[sec]));
if assigned(telf32section(sects[sec]).relocsect) then
writesectionheader(telf32section(sects[sec]).relocsect);
end;
writesectionheader(shstrtabsect);
writesectionheader(symtabsect);
writesectionheader(strtabsect);
{ .symtab }
symtabsect.alignsection;
hp:=symtabsect.data^.firstblock;
while assigned(hp) do
begin
writer.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
{ .strtab }
strtabsect.writealign(4);
hp:=strtabsect.data^.firstblock;
while assigned(hp) do
begin
writer.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
{ .rel sections }
for sec:=low(tsection) to high(tsection) do
if assigned(sects[sec]) and
assigned(telf32section(sects[sec]).relocsect) then
begin
telf32section(sects[sec]).relocsect.alignsection;
hp:=telf32section(sects[sec]).relocsect.data^.firstblock;
while assigned(hp) do
begin
writer.write(hp^.data,hp^.used);
hp:=hp^.next;
end;
end;
end;
end;
end.
{
$Log$
Revision 1.2 2000-11-12 22:45:14 peter
Revision 1.3 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.2 2000/11/12 22:45:14 peter
* moved setting of stab hdrsym
Revision 1.1 2000/11/12 22:20:37 peter

View File

@ -40,14 +40,13 @@ type
fmag : array[0..1] of char;
end;
parobjectwriter=^tarobjectwriter;
tarobjectwriter=object(tobjectwriter)
constructor Init(const Aarfn:string);
destructor Done;virtual;
procedure create(const fn:string);virtual;
procedure close;virtual;
procedure writesym(const sym:string);virtual;
procedure write(const b;len:longint);virtual;
tarobjectwriter=class(tobjectwriter)
constructor create(const Aarfn:string);
destructor destroy;override;
procedure createfile(const fn:string);override;
procedure closefile;override;
procedure writesym(const sym:string);override;
procedure write(const b;len:longint);override;
private
arfn : string;
arhdr : tarhdr;
@ -115,7 +114,7 @@ end;
TArObjectWriter
*****************************************************************************}
constructor tarobjectwriter.init(const Aarfn:string);
constructor tarobjectwriter.create(const Aarfn:string);
var
time : datetime;
dummy : word;
@ -132,7 +131,7 @@ begin
end;
destructor tarobjectwriter.done;
destructor tarobjectwriter.destroy;
begin
if Errorcount=0 then
writear;
@ -172,7 +171,7 @@ begin
end;
procedure tarobjectwriter.create(const fn:string);
procedure tarobjectwriter.createfile(const fn:string);
begin
objfn:=fn;
objpos:=ardata^.size;
@ -180,7 +179,7 @@ begin
end;
procedure tarobjectwriter.close;
procedure tarobjectwriter.closefile;
begin
ardata^.align(2);
{ fix the size in the header }
@ -282,7 +281,11 @@ end;
end.
{
$Log$
Revision 1.5 2000-09-24 15:06:20 peter
Revision 1.6 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.5 2000/09/24 15:06:20 peter
* use defines.inc
Revision 1.4 2000/08/19 18:44:27 peter

View File

@ -27,12 +27,11 @@ unit owbase;
interface
type
pobjectwriter=^tobjectwriter;
tobjectwriter=object
constructor Init;
destructor Done;virtual;
procedure create(const fn:string);virtual;
procedure close;virtual;
tobjectwriter=class
constructor create;
destructor destroy;override;
procedure createfile(const fn:string);virtual;
procedure closefile;virtual;
procedure writesym(const sym:string);virtual;
procedure write(const b;len:longint);virtual;
private
@ -53,7 +52,7 @@ uses
const
bufsize = 32768;
constructor tobjectwriter.init;
constructor tobjectwriter.create;
begin
getmem(buf,bufsize);
bufidx:=0;
@ -62,15 +61,15 @@ begin
end;
destructor tobjectwriter.done;
destructor tobjectwriter.destroy;
begin
if opened then
close;
closefile;
freemem(buf,bufsize);
end;
procedure tobjectwriter.create(const fn:string);
procedure tobjectwriter.createfile(const fn:string);
begin
assign(f,fn);
{$I-}
@ -87,7 +86,7 @@ begin
end;
procedure tobjectwriter.close;
procedure tobjectwriter.closefile;
begin
if bufidx>0 then
writebuf;
@ -150,7 +149,11 @@ end;
end.
{
$Log$
Revision 1.4 2000-09-24 15:06:20 peter
Revision 1.5 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.4 2000/09/24 15:06:20 peter
* use defines.inc
Revision 1.3 2000/08/19 18:44:27 peter

View File

@ -427,13 +427,13 @@ implementation
levelcount:=1;
withsymtable:=new(pwithsymtable,init);
withsymtable^.symsearch:=symtab^.symsearch;
withsymtable^.next:=symtablestack;
if (p.nodetype=loadn) and
(tloadnode(p).symtable=aktprocsym^.definition^.localst) then
pwithsymtable(withsymtable)^.direct_with:=true;
{symtab^.withnode:=p; not yet allocated !! }
pwithsymtable(withsymtable)^.withrefnode:=p;
if (p.nodetype=loadn) and
(tloadnode(p).symtable=aktprocsym^.definition^.localst) then
pwithsymtable(withsymtable)^.direct_with:=true;
{symtab^.withnode:=p; not yet allocated !! }
pwithsymtable(withsymtable)^.withrefnode:=p;
withsymtable^.defowner:=precorddef(p.resulttype);
withsymtable^.next:=symtablestack;
symtablestack:=withsymtable;
end;
end;
@ -1259,7 +1259,11 @@ implementation
end.
{
$Log$
Revision 1.17 2000-12-16 22:45:55 jonas
Revision 1.18 2000-12-23 19:59:35 peter
* object to class for ow/og objects
* split objectdata from objectoutput
Revision 1.17 2000/12/16 22:45:55 jonas
* fixed case statements with int64 values
Revision 1.16 2000/11/29 00:30:37 florian