Skip to content

Commit a9acbd6

Browse files
committed
Refactor
1 parent b9d65a5 commit a9acbd6

12 files changed

+112
-160
lines changed

src/arch-arm32.cc

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -295,20 +295,17 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
295295
Symbol<E> &sym = *file.symbols[rel.r_sym];
296296
u8 *loc = base + rel.r_offset;
297297

298-
auto check = [&](i64 val, i64 lo, i64 hi) {
299-
if (val < lo || hi <= val)
300-
Error(ctx) << *this << ": relocation " << rel << " against "
301-
<< sym << " out of range: " << val << " is not in ["
302-
<< lo << ", " << hi << ")";
303-
};
304-
305298
u64 S = sym.get_addr(ctx);
306299
u64 A = get_addend(*this, rel);
307300
u64 P = get_addr() + rel.r_offset;
308301
u64 T = S & 1;
309302
u64 G = sym.get_got_idx(ctx) * sizeof(Word<E>);
310303
u64 GOT = ctx.got->shdr.sh_addr;
311304

305+
auto check = [&](i64 val, i64 lo, i64 hi) {
306+
check_range(ctx, i, val, lo, hi);
307+
};
308+
312309
auto get_thumb_thunk_addr = [&] { return sym.get_thunk_addr(ctx, P); };
313310
auto get_arm_thunk_addr = [&] { return sym.get_thunk_addr(ctx, P) + 4; };
314311

src/arch-arm64.cc

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -155,19 +155,16 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
155155
Symbol<E> &sym = *file.symbols[rel.r_sym];
156156
u8 *loc = base + rel.r_offset;
157157

158-
auto check = [&](i64 val, i64 lo, i64 hi) {
159-
if (val < lo || hi <= val)
160-
Error(ctx) << *this << ": relocation " << rel << " against "
161-
<< sym << " out of range: " << val << " is not in ["
162-
<< lo << ", " << hi << ")";
163-
};
164-
165158
u64 S = sym.get_addr(ctx);
166159
u64 A = rel.r_addend;
167160
u64 P = get_addr() + rel.r_offset;
168161
u64 G = sym.get_got_idx(ctx) * sizeof(Word<E>);
169162
u64 GOT = ctx.got->shdr.sh_addr;
170163

164+
auto check = [&](i64 val, i64 lo, i64 hi) {
165+
check_range(ctx, i, val, lo, hi);
166+
};
167+
171168
switch (rel.r_type) {
172169
case R_AARCH64_ABS64:
173170
break;
@@ -448,33 +445,28 @@ void InputSection<E>::apply_reloc_nonalloc(Context<E> &ctx, u8 *base) {
448445
Symbol<E> &sym = *file.symbols[rel.r_sym];
449446
u8 *loc = base + rel.r_offset;
450447

451-
auto check = [&](i64 val, i64 lo, i64 hi) {
452-
if (val < lo || hi <= val)
453-
Error(ctx) << *this << ": relocation " << rel << " against "
454-
<< sym << " out of range: " << val << " is not in ["
455-
<< lo << ", " << hi << ")";
456-
};
457-
458448
SectionFragment<E> *frag;
459449
i64 frag_addend;
460450
std::tie(frag, frag_addend) = get_fragment(ctx, rel);
461451

462452
u64 S = frag ? frag->get_addr(ctx) : sym.get_addr(ctx);
463453
u64 A = frag ? frag_addend : (i64)rel.r_addend;
464454

455+
auto check = [&](i64 val, i64 lo, i64 hi) {
456+
check_range(ctx, val, i, lo, hi);
457+
};
458+
465459
switch (rel.r_type) {
466460
case R_AARCH64_ABS64:
467461
if (std::optional<u64> val = get_tombstone(sym, frag))
468462
*(U64<E> *)loc = *val;
469463
else
470464
*(U64<E> *)loc = S + A;
471465
break;
472-
case R_AARCH64_ABS32: {
473-
i64 val = S + A;
474-
check(val, 0, 1LL << 32);
475-
*(U32<E> *)loc = val;
466+
case R_AARCH64_ABS32:
467+
check(S + A, 0, 1LL << 32);
468+
*(U32<E> *)loc = S + A;
476469
break;
477-
}
478470
default:
479471
Fatal(ctx) << *this << ": invalid relocation for non-allocated sections: "
480472
<< rel;

src/arch-i386.cc

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ static void relax_ld_to_le(u8 *loc, ElfRel<E> rel, u64 tls_size) {
237237
case R_386_GOT32X: {
238238
static const u8 insn[] = {
239239
0x65, 0xa1, 0, 0, 0, 0, // mov %gs:0, %eax
240-
0x2e, 0x2d, 0, 0, 0, 0, // sub $tls_size, %eax
240+
0x81, 0xe8, 0, 0, 0, 0, // sub $tls_size, %eax
241241
};
242242
memcpy(loc - 2, insn, sizeof(insn));
243243
*(ul32 *)(loc + 6) = tls_size;
@@ -288,19 +288,16 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
288288
Symbol<E> &sym = *file.symbols[rel.r_sym];
289289
u8 *loc = base + rel.r_offset;
290290

291-
auto check = [&](i64 val, i64 lo, i64 hi) {
292-
if (val < lo || hi <= val)
293-
Error(ctx) << *this << ": relocation " << rel << " against "
294-
<< sym << " out of range: " << val << " is not in ["
295-
<< lo << ", " << hi << ")";
296-
};
297-
298291
u64 S = sym.get_addr(ctx);
299292
u64 A = get_addend(*this, rel);
300293
u64 P = get_addr() + rel.r_offset;
301294
u64 G = sym.get_got_idx(ctx) * sizeof(Word<E>);
302295
u64 GOT = ctx.got->shdr.sh_addr;
303296

297+
auto check = [&](i64 val, i64 lo, i64 hi) {
298+
check_range(ctx, i, val, lo, hi);
299+
};
300+
304301
switch (rel.r_type) {
305302
case R_386_8:
306303
check(S + A, 0, 1 << 8);
@@ -447,13 +444,6 @@ void InputSection<E>::apply_reloc_nonalloc(Context<E> &ctx, u8 *base) {
447444
Symbol<E> &sym = *file.symbols[rel.r_sym];
448445
u8 *loc = base + rel.r_offset;
449446

450-
auto check = [&](i64 val, i64 lo, i64 hi) {
451-
if (val < lo || hi <= val)
452-
Error(ctx) << *this << ": relocation " << rel << " against "
453-
<< sym << " out of range: " << val << " is not in ["
454-
<< lo << ", " << hi << ")";
455-
};
456-
457447
SectionFragment<E> *frag;
458448
i64 frag_addend;
459449
std::tie(frag, frag_addend) = get_fragment(ctx, rel);
@@ -462,6 +452,10 @@ void InputSection<E>::apply_reloc_nonalloc(Context<E> &ctx, u8 *base) {
462452
u64 A = frag ? frag_addend : get_addend(*this, rel);
463453
u64 GOT = ctx.got->shdr.sh_addr;
464454

455+
auto check = [&](i64 val, i64 lo, i64 hi) {
456+
check_range(ctx, val, i, lo, hi);
457+
};
458+
465459
switch (rel.r_type) {
466460
case R_386_8:
467461
check(S + A, 0, 1 << 8);

src/arch-loongarch.cc

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -298,20 +298,6 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
298298
i64 r_offset = rel.r_offset - r_delta;
299299
u8 *loc = base + r_offset;
300300

301-
auto check = [&](i64 val, i64 lo, i64 hi) {
302-
if (val < lo || hi <= val)
303-
Error(ctx) << *this << ": relocation " << rel << " against "
304-
<< sym << " out of range: " << val << " is not in ["
305-
<< lo << ", " << hi << ")";
306-
};
307-
308-
auto check_branch = [&](i64 val, i64 lo, i64 hi) {
309-
if (val & 0b11)
310-
Error(ctx) << *this << ": misaligned symbol " << sym
311-
<< " for relocation " << rel;
312-
check(val, lo, hi);
313-
};
314-
315301
// Unlike other psABIs, the LoongArch ABI uses the same relocation
316302
// types to refer to GOT entries for thread-local symbols and regular
317303
// ones. Therefore, G may refer to a TLSGD or a regular GOT slot
@@ -335,6 +321,17 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
335321
u64 G = got_idx * sizeof(Word<E>);
336322
u64 GOT = ctx.got->shdr.sh_addr;
337323

324+
auto check = [&](i64 val, i64 lo, i64 hi) {
325+
check_range(ctx, i, val, lo, hi);
326+
};
327+
328+
auto check_branch = [&](i64 val, i64 lo, i64 hi) {
329+
check(val, lo, hi);
330+
if (val & 0b11)
331+
Error(ctx) << *this << ": misaligned symbol " << sym
332+
<< " for relocation " << rel;
333+
};
334+
338335
switch (rel.r_type) {
339336
case R_LARCH_32:
340337
assert(E::is_64);

src/arch-m68k.cc

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,14 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
8686
Symbol<E> &sym = *file.symbols[rel.r_sym];
8787
u8 *loc = base + rel.r_offset;
8888

89+
u64 S = sym.get_addr(ctx);
90+
u64 A = rel.r_addend;
91+
u64 P = get_addr() + rel.r_offset;
92+
u64 G = sym.get_got_idx(ctx) * sizeof(Word<E>);
93+
u64 GOT = ctx.got->shdr.sh_addr;
94+
8995
auto check = [&](i64 val, i64 lo, i64 hi) {
90-
if (val < lo || hi <= val)
91-
Error(ctx) << *this << ": relocation " << rel << " against "
92-
<< sym << " out of range: " << val << " is not in ["
93-
<< lo << ", " << hi << ")";
96+
check_range(ctx, i, val, lo, hi);
9497
};
9598

9699
auto write16 = [&](u64 val) {
@@ -113,12 +116,6 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
113116
*loc = val;
114117
};
115118

116-
u64 S = sym.get_addr(ctx);
117-
u64 A = rel.r_addend;
118-
u64 P = get_addr() + rel.r_offset;
119-
u64 G = sym.get_got_idx(ctx) * sizeof(Word<E>);
120-
u64 GOT = ctx.got->shdr.sh_addr;
121-
122119
switch (rel.r_type) {
123120
case R_68K_32:
124121
break;

src/arch-ppc64v1.cc

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -162,20 +162,17 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
162162
Symbol<E> &sym = *file.symbols[rel.r_sym];
163163
u8 *loc = base + rel.r_offset;
164164

165-
auto check = [&](i64 val, i64 lo, i64 hi) {
166-
if (val < lo || hi <= val)
167-
Error(ctx) << *this << ": relocation " << rel << " against "
168-
<< sym << " out of range: " << val << " is not in ["
169-
<< lo << ", " << hi << ")";
170-
};
171-
172165
u64 S = sym.get_addr(ctx);
173166
u64 A = rel.r_addend;
174167
u64 P = get_addr() + rel.r_offset;
175168
u64 G = sym.get_got_idx(ctx) * sizeof(Word<E>);
176169
u64 GOT = ctx.got->shdr.sh_addr;
177170
u64 TOC = ctx.extra.TOC->value;
178171

172+
auto check = [&](i64 val, i64 lo, i64 hi) {
173+
check_range(ctx, i, val, lo, hi);
174+
};
175+
179176
switch (rel.r_type) {
180177
case R_PPC64_TOC:
181178
break;
@@ -293,33 +290,28 @@ void InputSection<E>::apply_reloc_nonalloc(Context<E> &ctx, u8 *base) {
293290
Symbol<E> &sym = *file.symbols[rel.r_sym];
294291
u8 *loc = base + rel.r_offset;
295292

296-
auto check = [&](i64 val, i64 lo, i64 hi) {
297-
if (val < lo || hi <= val)
298-
Error(ctx) << *this << ": relocation " << rel << " against "
299-
<< sym << " out of range: " << val << " is not in ["
300-
<< lo << ", " << hi << ")";
301-
};
302-
303293
SectionFragment<E> *frag;
304294
i64 frag_addend;
305295
std::tie(frag, frag_addend) = get_fragment(ctx, rel);
306296

307297
u64 S = frag ? frag->get_addr(ctx) : sym.get_addr(ctx);
308298
u64 A = frag ? frag_addend : (i64)rel.r_addend;
309299

300+
auto check = [&](i64 val, i64 lo, i64 hi) {
301+
check_range(ctx, val, i, lo, hi);
302+
};
303+
310304
switch (rel.r_type) {
311305
case R_PPC64_ADDR64:
312306
if (std::optional<u64> val = get_tombstone(sym, frag))
313307
*(ub64 *)loc = *val;
314308
else
315309
*(ub64 *)loc = S + A;
316310
break;
317-
case R_PPC64_ADDR32: {
318-
i64 val = S + A;
319-
check(val, 0, 1LL << 32);
320-
*(ub32 *)loc = val;
311+
case R_PPC64_ADDR32:
312+
check(S + A, 0, 1LL << 32);
313+
*(ub32 *)loc = S + A;
321314
break;
322-
}
323315
case R_PPC64_DTPREL64:
324316
*(ub64 *)loc = S + A - ctx.dtp_addr;
325317
break;

src/arch-ppc64v2.cc

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -354,33 +354,28 @@ void InputSection<E>::apply_reloc_nonalloc(Context<E> &ctx, u8 *base) {
354354
Symbol<E> &sym = *file.symbols[rel.r_sym];
355355
u8 *loc = base + rel.r_offset;
356356

357-
auto check = [&](i64 val, i64 lo, i64 hi) {
358-
if (val < lo || hi <= val)
359-
Error(ctx) << *this << ": relocation " << rel << " against "
360-
<< sym << " out of range: " << val << " is not in ["
361-
<< lo << ", " << hi << ")";
362-
};
363-
364357
SectionFragment<E> *frag;
365358
i64 frag_addend;
366359
std::tie(frag, frag_addend) = get_fragment(ctx, rel);
367360

368361
u64 S = frag ? frag->get_addr(ctx) : sym.get_addr(ctx);
369362
u64 A = frag ? frag_addend : (i64)rel.r_addend;
370363

364+
auto check = [&](i64 val, i64 lo, i64 hi) {
365+
check_range(ctx, i, val, lo, hi);
366+
};
367+
371368
switch (rel.r_type) {
372369
case R_PPC64_ADDR64:
373370
if (std::optional<u64> val = get_tombstone(sym, frag))
374371
*(ul64 *)loc = *val;
375372
else
376373
*(ul64 *)loc = S + A;
377374
break;
378-
case R_PPC64_ADDR32: {
379-
i64 val = S + A;
380-
check(val, 0, 1LL << 32);
381-
*(ul32 *)loc = val;
375+
case R_PPC64_ADDR32:
376+
check(S + A, 0, 1LL << 32);
377+
*(ul32 *)loc = S + A;
382378
break;
383-
}
384379
case R_PPC64_DTPREL64:
385380
*(ul64 *)loc = S + A - ctx.dtp_addr;
386381
break;

src/arch-riscv.cc

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -291,19 +291,16 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
291291
i64 r_offset = rel.r_offset - r_delta;
292292
u8 *loc = base + r_offset;
293293

294-
auto check = [&](i64 val, i64 lo, i64 hi) {
295-
if (val < lo || hi <= val)
296-
Error(ctx) << *this << ": relocation " << rel << " against "
297-
<< sym << " out of range: " << val << " is not in ["
298-
<< lo << ", " << hi << ")";
299-
};
300-
301294
u64 S = sym.get_addr(ctx);
302295
u64 A = rel.r_addend;
303296
u64 P = get_addr() + r_offset;
304297
u64 G = sym.get_got_idx(ctx) * sizeof(Word<E>);
305298
u64 GOT = ctx.got->shdr.sh_addr;
306299

300+
auto check = [&](i64 val, i64 lo, i64 hi) {
301+
check_range(ctx, i, val, lo, hi);
302+
};
303+
307304
switch (rel.r_type) {
308305
case R_RISCV_32:
309306
assert(E::is_64);

0 commit comments

Comments
 (0)