Skip to content

Commit 8d24461

Browse files
WalterBrightthewilsonator
authored andcommitted
refactor AArch64 and subtractor
1 parent 39e52fe commit 8d24461

2 files changed

Lines changed: 20 additions & 15 deletions

File tree

compiler/src/dmd/backend/dwarfdbginf.d

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ static if (1)
296296
}
297297
return reg;
298298
}
299-
else if (config.target_cpu == TARGET_AArch64)
299+
else if (AArch64)
300300
{ // https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst#dwarf-register-names
301301
return (reg < 32) ? reg : reg - 32 + 64;
302302
}
@@ -652,7 +652,7 @@ static if (1)
652652
* EH code: "zPLR"
653653
*/
654654

655-
const bool AArch64 = config.target_cpu == TARGET_AArch64;
655+
const bool AArch64 = AArch64();
656656
const uint startsize = cast(uint)buf.length();
657657

658658
// Length of CIE, not including padding
@@ -925,7 +925,7 @@ static if (1)
925925
err_nomem();
926926
memcpy(name, getSymName(sfunc), len);
927927
memcpy(name + len, ".eh".ptr, 3 + 1);
928-
SC sclass = (config.target_cpu == TARGET_AArch64) ? SC.locstat : SC.global;
928+
SC sclass = AArch64 ? SC.locstat : SC.global;
929929
fdesym = symbol_name(name[0 .. len + 3], sclass, tspvoid);
930930
Obj.pubdef(dfseg, fdesym, startsize);
931931
symbol_keep(fdesym);
@@ -937,7 +937,7 @@ static if (1)
937937
/* Do not have info on naked functions. Assume they set up standard stack frame.
938938
*/
939939
int cfa_offset;
940-
dwarf_emit_eh_frame(config.target_cpu == TARGET_AArch64, 0, cfa_offset);
940+
dwarf_emit_eh_frame(AArch64, 0, cfa_offset);
941941
}
942942

943943
// Length of FDE, not including padding
@@ -965,7 +965,7 @@ static if (1)
965965
if (config.objfmt == OBJ_ELF)
966966
{
967967
fixup = I64 ? R_X86_64_PC32 : R_386_PC32;
968-
if (config.target_cpu == TARGET_AArch64)
968+
if (AArch64)
969969
fixup = R_AARCH64_PREL32;
970970
buf.write32(cast(uint)(I64 ? 0 : sfunc.Soffset)); // address of function
971971
Obj.addrel(dfseg, startsize + 8, fixup, cast(int)MAP_SEG2SYMIDX(sfunc.Sseg), sfunc.Soffset);
@@ -1742,7 +1742,7 @@ static if (1)
17421742
//printf("dwarf_func_start(%s)\n", sfunc.Sident.ptr);
17431743
CFA_state* cfa_state = &CFA_state_current;
17441744
memset(cfa_state,0,CFA_state.sizeof);
1745-
if (config.target_cpu == TARGET_AArch64)
1745+
if (AArch64)
17461746
{
17471747
cfa_state.reg = INSTR.SP;
17481748
cfa_state.offset = OFFSET_FAC;
@@ -3324,3 +3324,6 @@ private char* filespecname(const(char)* filespec) nothrow
33243324
{ }
33253325
return cast(char*)p;
33263326
}
3327+
3328+
private nothrow
3329+
bool AArch64() { return config.target_cpu == TARGET_AArch64; }

compiler/src/dmd/backend/machobj.d

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/**
2-
* Generate Mach-O object files
2+
* Generate Mach-O object files.
3+
* Does 64 bit X86_64 and 64 bit AArch64.
4+
* 32 bit X86_64 is more or less abandoned.
35
*
46
* Compiler implementation of the
57
* $(LINK2 https://www.dlang.org, D programming language).
@@ -252,7 +254,7 @@ struct Relocation
252254
uint targseg; // if !=0, then location is to be fixed up
253255
// to address of start of this segment
254256
REL rtype; // REL.address or REL.rel or REL.add
255-
ubyte flag; // 1: emit SUBTRACTOR/UNSIGNED pair
257+
bool subtractor; // true: emit SUBTRACTOR/UNSIGNED pair
256258
short val; // 0, -1, -2, -4
257259
}
258260

@@ -911,13 +913,13 @@ void MachObj_term(const(char)[] objfilename)
911913
bool isPersonality = strcmp(s.Sident.ptr, "_D6object8TypeInfo8opEqualsMxFNbNfxCQBbZb") == 0;
912914
if (isPersonality)
913915
{ symbol_print(*s);
914-
printf("%d:x%04llx isCode %x : targseg %d targsym %s REL%s flag %d\n", seg, r.offset, pseg.isCode(), r.targseg, s ? s.Sident.ptr : "0", rs, r.flag);
916+
printf("%d:x%04llx isCode %x : targseg %d targsym %s REL%s flag %d\n", seg, r.offset, pseg.isCode(), r.targseg, s ? s.Sident.ptr : "0", rs, r.subtractor);
915917
}
916918
if (0)//s.Sclass == SC.locstat)
917919
{ symbol_print(*s);
918-
printf("%d:x%04llx isCode %x : targseg %d targsym %s REL%s flag %d\n", seg, r.offset, pseg.isCode(), r.targseg, s ? s.Sident.ptr : "0", rs, r.flag);
920+
printf("%d:x%04llx isCode %x : targseg %d targsym %s REL%s flag %d\n", seg, r.offset, pseg.isCode(), r.targseg, s ? s.Sident.ptr : "0", rs, r.subtractor);
919921
}
920-
if (r.flag == 1) // emit SUBTRACTOR/UNSIGNED pair
922+
if (r.subtractor) // emit SUBTRACTOR/UNSIGNED pair
921923
{
922924
//printf("rel1\n");
923925
rel.r_type = ARM64_RELOC_SUBTRACTOR;
@@ -1188,7 +1190,7 @@ void MachObj_term(const(char)[] objfilename)
11881190
{
11891191
//printf("Relocation\n");
11901192
//symbol_print(*s);
1191-
if (r.flag == 1) // emit SUBTRACTOR/UNSIGNED pair
1193+
if (r.subtractor) // emit SUBTRACTOR/UNSIGNED pair
11921194
{
11931195
if (I64)
11941196
{
@@ -2727,7 +2729,7 @@ void MachObj_addrel(int seg, targ_size_t offset, Symbol* targsym,
27272729
rel.targsym = targsym;
27282730
rel.targseg = targseg;
27292731
rel.rtype = rtype;
2730-
rel.flag = 0;
2732+
rel.subtractor = false;
27312733
rel.funcsym = funcsym_p;
27322734
rel.val = cast(short)val;
27332735
seg_data* pseg = SegData[seg];
@@ -2963,7 +2965,7 @@ int MachObj_reftoident(int seg, targ_size_t offset, Symbol* s, targ_size_t val,
29632965
rel.targsym = null;
29642966
rel.targseg = machobj.pointersSeg;
29652967
rel.rtype = REL.address;
2966-
rel.flag = 0;
2968+
rel.subtractor = false;
29672969
rel.funcsym = null;
29682970
rel.val = 0;
29692971
seg_data* pseg2 = SegData[seg];
@@ -3248,7 +3250,7 @@ int dwarf_eh_frame_fixup(int dfseg, targ_size_t offset, Symbol* s, targ_size_t v
32483250
rel.targsym = s;
32493251
rel.targseg = 0;
32503252
rel.rtype = REL.address;
3251-
rel.flag = 1;
3253+
rel.subtractor = true;
32523254
rel.funcsym = fdesym;
32533255
rel.val = 0;
32543256
seg_data* pseg = SegData[dfseg];

0 commit comments

Comments
 (0)