diff options
author | karoly <karoly@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-04-28 23:10:03 +0000 |
---|---|---|
committer | karoly <karoly@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-04-28 23:10:03 +0000 |
commit | 3163f4e783edfc8a680238012f16a254e1c27518 (patch) | |
tree | 3df7bc230bec01d7c18606f66d84069423acca97 | |
parent | 618766627c23211d9b21386ad5ef6bea10e1a3f9 (diff) | |
download | fpc-3163f4e783edfc8a680238012f16a254e1c27518.tar.gz |
z80: fix global symbols and section attributes in the vasm writer
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@45163 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | compiler/z80/agz80vasm.pas | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/compiler/z80/agz80vasm.pas b/compiler/z80/agz80vasm.pas index 8598337afa..1e2e749c50 100644 --- a/compiler/z80/agz80vasm.pas +++ b/compiler/z80/agz80vasm.pas @@ -44,6 +44,7 @@ unit agz80vasm; procedure WriteDecodedSleb128(a: int64); procedure WriteDecodedUleb128(a: qword); procedure WriteRealConstAsBytes(hp: tai_realconst; const dbdir: string; do_line: boolean); + function sectionattrs(atype:TAsmSectiontype):string; function sectionname(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder):string; procedure WriteSection(atype:TAsmSectiontype;const aname:string;aorder:TAsmSectionOrder;secalign:longint; secflags:TSectionFlags=[];secprogbits:TSectionProgbits=SPB_None); @@ -245,6 +246,21 @@ unit agz80vasm; writer.AsmLn; end; + function TZ80vasm.sectionattrs(atype:TAsmSectiontype):string; + begin + case atype of + sec_code, sec_fpc, sec_init, sec_fini: + result:='acrx'; + sec_data, sec_rodata, sec_rodata_norel, sec_bss, sec_threadvar: + result:='adrw'; + sec_stab, sec_stabstr: + result:='dr'; + else + result:=''; + end; + end; + + function TZ80vasm.sectionname(atype: TAsmSectiontype; const aname: string; aorder: TAsmSectionOrder): string; const @@ -352,6 +368,9 @@ unit agz80vasm; end; s:=sectionname(atype,aname,aorder); writer.AsmWrite(s); + s:=sectionattrs(atype); + if (s<>'') then + writer.AsmWrite(',"'+s+'"'); writer.AsmLn; LastSecType:=atype; end; @@ -646,16 +665,14 @@ unit agz80vasm; if not(tai_symbol(hp).has_value) then begin if tai_symbol(hp).is_global then - writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name) + ':') - else - writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name) + ':'); + writer.AsmWriteLn(#9'.globl '+ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name)); + writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name) + ':'); end else begin if tai_symbol(hp).is_global then - writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name) + '=' + tostr(tai_symbol(hp).value)) - else - writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name) + '=' + tostr(tai_symbol(hp).value)); + writer.AsmWriteLn(#9'.globl '+ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name)) + writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_symbol(hp).sym.name) + '=' + tostr(tai_symbol(hp).value)); end; end; ait_symbol_end : @@ -664,9 +681,8 @@ unit agz80vasm; ait_datablock : begin if tai_datablock(hp).is_global or SmartAsm then - writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_datablock(hp).sym.name) + ':') - else - writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_datablock(hp).sym.name) + ':'); + writer.AsmWriteLn(#9'.globl '+ApplyAsmSymbolRestrictions(tai_datablock(hp).sym.name)); + writer.AsmWriteLn(ApplyAsmSymbolRestrictions(tai_datablock(hp).sym.name) + ':'); {if SmartAsm then AddSymbol(tai_datablock(hp).sym.name,true);} writer.AsmWriteLn(#9'.zero'#9+tostr(tai_datablock(hp).size)); |