Skip to content

Commit 6313729

Browse files
WalterBrightthewilsonator
authored andcommitted
get personality fixup correct
1 parent 2feb191 commit 6313729

2 files changed

Lines changed: 30 additions & 11 deletions

File tree

compiler/src/dmd/backend/dwarfdbginf.d

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,8 @@ static if (1)
925925
err_nomem();
926926
memcpy(name, getSymName(sfunc), len);
927927
memcpy(name + len, ".eh".ptr, 3 + 1);
928-
fdesym = symbol_name(name[0 .. len + 3], SC.global, tspvoid);
928+
SC sclass = (config.target_cpu == TARGET_AArch64) ? SC.locstat : SC.global;
929+
fdesym = symbol_name(name[0 .. len + 3], sclass, tspvoid);
929930
Obj.pubdef(dfseg, fdesym, startsize);
930931
symbol_keep(fdesym);
931932
free(name);

compiler/src/dmd/backend/machobj.d

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,7 @@ void MachObj_term(const(char)[] objfilename)
900900
r.rtype == REL.add ? "add" :
901901
r.rtype == REL.rel26 ? "rel26" :
902902
"rel";
903+
//if (s) printf("seg: %d targsym %s funcsym %s\n", seg, s ? s.Sident.ptr : "null", r.funcsym ? r.funcsym.Sident.ptr : "null");
903904
relocation_info rel;
904905
scattered_relocation_info srel;
905906
if (machobj.AArch64)
@@ -912,6 +913,10 @@ void MachObj_term(const(char)[] objfilename)
912913
{ symbol_print(*s);
913914
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);
914915
}
916+
if (0)//s.Sclass == SC.locstat)
917+
{ 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);
919+
}
915920
if (r.flag == 1) // emit SUBTRACTOR/UNSIGNED pair
916921
{
917922
//printf("rel1\n");
@@ -920,7 +925,7 @@ void MachObj_term(const(char)[] objfilename)
920925
rel.r_symbolnum = r.funcsym.Sxtrnnum;
921926
rel.r_pcrel = 0;
922927
rel.r_length = 3;
923-
rel.r_extern = 1;
928+
rel.r_extern = r.funcsym.Sclass == SC.locstat ? 0 : 1;
924929
machobj.fobjbuf.write(&rel, rel.sizeof);
925930
foffset += (rel).sizeof;
926931
++nreloc;
@@ -1003,7 +1008,7 @@ void MachObj_term(const(char)[] objfilename)
10031008
rel.r_address = cast(int)r.offset;
10041009
rel.r_symbolnum = s.Sxtrnnum;
10051010
rel.r_length = 2;
1006-
rel.r_extern = 1;
1011+
rel.r_extern = 1; // 0?
10071012
machobj.fobjbuf.write(&rel, rel.sizeof);
10081013
foffset += rel.sizeof;
10091014
nreloc++;
@@ -1040,8 +1045,16 @@ void MachObj_term(const(char)[] objfilename)
10401045
{
10411046
rel.r_address = cast(int)r.offset;
10421047
rel.r_symbolnum = s.Sxtrnnum;
1043-
rel.r_pcrel = 0;
1044-
rel.r_length = 3;
1048+
if (r.rtype == REL.rel)
1049+
{
1050+
rel.r_pcrel = 1;
1051+
rel.r_length = 2;
1052+
}
1053+
else
1054+
{
1055+
rel.r_pcrel = 0;
1056+
rel.r_length = 3;
1057+
}
10451058
rel.r_extern = 1;
10461059
rel.r_type = ARM64_RELOC_UNSIGNED; // RELOC_POINTER_TO_GOT?
10471060
machobj.fobjbuf.write(&rel, rel.sizeof);
@@ -2508,6 +2521,7 @@ void MachObj_pubdef(int seg, Symbol* s, targ_size_t offset)
25082521
}
25092522
goto default;
25102523
default:
2524+
//printf("Writing to local symbuf: %s\n", s.Sident.ptr);
25112525
machobj.local_symbuf.write((&s)[0 .. 1]);
25122526
break;
25132527
}
@@ -2707,7 +2721,7 @@ size_t MachObj_bytes(int seg, targ_size_t offset, size_t nbytes, const(void)* p)
27072721
void MachObj_addrel(int seg, targ_size_t offset, Symbol* targsym,
27082722
uint targseg, REL rtype, int val = 0)
27092723
{
2710-
//printf("MachObj_addrel()\n");
2724+
//printf("MachObj_addrel() %s\n", targsym.Sident.ptr);
27112725
Relocation rel = void;
27122726
rel.offset = offset;
27132727
rel.targsym = targsym;
@@ -2993,10 +3007,10 @@ int MachObj_reftoidentAArch64(int seg, targ_size_t offset, Symbol* s, targ_size_
29933007
{
29943008
debug printf("\nMachObj_reftoidentAArch64('%s' seg %d, offset x%llx, val x%llx, flags x%x) ",
29953009
s.Sident.ptr,seg,cast(ulong)offset,cast(ulong)val,flags);
2996-
CF_print(flags);
2997-
debug printf("retsize = %d\n", retsize);
3010+
//CF_print(flags);
3011+
//debug printf("retsize = %d\n", retsize);
29983012
//dbg_printf("Sseg = %d, Sxtrnnum = %d\n",s.Sseg,s.Sxtrnnum);
2999-
symbol_print(*s);
3013+
//symbol_print(*s);
30003014
}
30013015
assert(seg > 0);
30023016
if (s.Sclass != SC.locstat && !s.Sxtrnnum)
@@ -3177,10 +3191,14 @@ void MachObj_write_pointerRef(Symbol* s, uint off)
31773191
* Returns:
31783192
* number of bytes written at seg:offset
31793193
*/
3194+
@trusted
31803195
int mach_dwarf_reftoident(int seg, targ_size_t offset, Symbol* s, targ_size_t val)
31813196
{
31823197
//printf("dwarf_reftoident(seg=%d offset=x%x s=%s val=x%x\n", seg, cast(int)offset, s.Sident.ptr, cast(int)val);
3183-
MachObj_reftoident(seg, offset, s, val + 4, I64 ? CFoff : CFindirect);
3198+
if (machobj.AArch64)
3199+
MachObj_reftoident(seg, offset, s, val + 4, CFselfrel);
3200+
else
3201+
MachObj_reftoident(seg, offset, s, val + 4, I64 ? CFoff : CFindirect);
31843202
return 4;
31853203
}
31863204

@@ -3216,7 +3234,7 @@ int mach_dwarf_reftoident(int seg, targ_size_t offset, Symbol* s, targ_size_t va
32163234
@trusted
32173235
int dwarf_eh_frame_fixup(int dfseg, targ_size_t offset, Symbol* s, targ_size_t val, Symbol* fdesym)
32183236
{
3219-
//printf("dwarf_eh_frame_fixup()\n");
3237+
//printf("dwarf_eh_frame_fixup() %s\n", fdesym.Sident.ptr);
32203238
OutBuffer* buf = SegData[dfseg].SDbuf;
32213239
assert(offset == buf.length());
32223240
assert(fdesym.Sseg == dfseg);

0 commit comments

Comments
 (0)