@@ -265,12 +265,13 @@ static bool addOptional(Ctx &ctx, StringRef name, uint64_t value,
265
265
// If from is 14, write ${prefix}14: firstInsn; ${prefix}15:
266
266
// firstInsn+0x200008; ...; ${prefix}31: firstInsn+(31-14)*0x200008; $tail
267
267
// The labels are defined only if they exist in the symbol table.
268
- static void writeSequence (Ctx &ctx, MutableArrayRef<uint32_t > buf,
269
- const char *prefix, int from, uint32_t firstInsn,
270
- ArrayRef<uint32_t > tail) {
268
+ static void writeSequence (Ctx &ctx, const char *prefix, int from,
269
+ uint32_t firstInsn, ArrayRef<uint32_t > tail) {
271
270
std::vector<Defined *> defined;
272
271
char name[16 ];
273
272
int first;
273
+ const size_t size = 32 - from + tail.size ();
274
+ MutableArrayRef<uint32_t > buf (bAlloc (ctx).Allocate <uint32_t >(size), size);
274
275
uint32_t *ptr = buf.data ();
275
276
for (int r = from; r < 32 ; ++r) {
276
277
format (" %s%d" , prefix, r).snprint (name, sizeof (name));
@@ -310,22 +311,20 @@ static void writeSequence(Ctx &ctx, MutableArrayRef<uint32_t> buf,
310
311
// significant enough to complicate our trunk implementation, so we take the
311
312
// simple approach and synthesize .text sections providing the implementation.
312
313
void elf::addPPC64SaveRestore (Ctx &ctx) {
313
- static uint32_t savegpr0[20 ], restgpr0[21 ], savegpr1[19 ], restgpr1[19 ];
314
314
constexpr uint32_t blr = 0x4e800020 , mtlr_0 = 0x7c0803a6 ;
315
315
316
316
// _restgpr0_14: ld 14, -144(1); _restgpr0_15: ld 15, -136(1); ...
317
317
// Tail: ld 0, 16(1); mtlr 0; blr
318
- writeSequence (ctx, restgpr0, " _restgpr0_" , 14 , 0xe9c1ff70 ,
319
- {0xe8010010 , mtlr_0, blr});
318
+ writeSequence (ctx, " _restgpr0_" , 14 , 0xe9c1ff70 , {0xe8010010 , mtlr_0, blr});
320
319
// _restgpr1_14: ld 14, -144(12); _restgpr1_15: ld 15, -136(12); ...
321
320
// Tail: blr
322
- writeSequence (ctx, restgpr1, " _restgpr1_" , 14 , 0xe9ccff70 , {blr});
321
+ writeSequence (ctx, " _restgpr1_" , 14 , 0xe9ccff70 , {blr});
323
322
// _savegpr0_14: std 14, -144(1); _savegpr0_15: std 15, -136(1); ...
324
323
// Tail: std 0, 16(1); blr
325
- writeSequence (ctx, savegpr0, " _savegpr0_" , 14 , 0xf9c1ff70 , {0xf8010010 , blr});
324
+ writeSequence (ctx, " _savegpr0_" , 14 , 0xf9c1ff70 , {0xf8010010 , blr});
326
325
// _savegpr1_14: std 14, -144(12); _savegpr1_15: std 15, -136(12); ...
327
326
// Tail: blr
328
- writeSequence (ctx, savegpr1, " _savegpr1_" , 14 , 0xf9ccff70 , {blr});
327
+ writeSequence (ctx, " _savegpr1_" , 14 , 0xf9ccff70 , {blr});
329
328
}
330
329
331
330
// Find the R_PPC64_ADDR64 in .rela.toc with matching offset.
0 commit comments