Lines Matching +full:x +full:- +full:rp
1 // SPDX-License-Identifier: GPL-2.0-only
12 * Strategy: alter the .o file in-place.
21 * then use "ld -r" to create a new file that omits the garbage.]
69 /* Per-file resource cleanup when multiple files. */
99 file_ptr = file_map + (sb.st_size - offset); in ulseek()
104 return -1; in ulseek()
106 return file_ptr - file_map; in ulseek()
118 off_t aoffset = (file_ptr + count) - file_end; in uwrite()
131 return -1; in uwrite()
134 cnt = file_end - file_ptr; in uwrite()
137 idx = aoffset - count; in uwrite()
145 memcpy(file_append + idx, buf + cnt, count - cnt); in uwrite()
168 * Use MAP_PRIVATE so that a few changes to the in-memory ElfXX_Ehdr
179 fd_map = -1; in mmap_file()
218 fd_map = -1; in mmap_file()
242 return -1; in make_nop_x86()
244 op = map + offset - 1; in make_nop_x86()
246 return -1; in make_nop_x86()
249 if (ulseek(offset - 1, SEEK_SET) < 0) in make_nop_x86()
250 return -1; in make_nop_x86()
252 return -1; in make_nop_x86()
285 if (memcmp(ptr - 4, push_arm, 4) == 0) { in make_nop_arm()
286 off -= 4; in make_nop_arm()
291 } else if (memcmp(ptr - 2, push_bl_mcount_thumb, 6) == 0) { in make_nop_arm()
294 off -= 2; in make_nop_arm()
297 return -1; in make_nop_arm()
301 return -1; in make_nop_arm()
305 return -1; in make_nop_arm()
306 } while (--cnt > 0); in make_nop_arm()
319 return -1; in make_nop_arm64()
323 return -1; in make_nop_arm64()
325 return -1; in make_nop_arm64()
347 return -1; in write_file()
353 return -1; in write_file()
360 return -1; in write_file()
366 return -1; in write_file()
373 static uint64_t w8rev(uint64_t const x) in w8rev() argument
375 return ((0xff & (x >> (0 * 8))) << (7 * 8)) in w8rev()
376 | ((0xff & (x >> (1 * 8))) << (6 * 8)) in w8rev()
377 | ((0xff & (x >> (2 * 8))) << (5 * 8)) in w8rev()
378 | ((0xff & (x >> (3 * 8))) << (4 * 8)) in w8rev()
379 | ((0xff & (x >> (4 * 8))) << (3 * 8)) in w8rev()
380 | ((0xff & (x >> (5 * 8))) << (2 * 8)) in w8rev()
381 | ((0xff & (x >> (6 * 8))) << (1 * 8)) in w8rev()
382 | ((0xff & (x >> (7 * 8))) << (0 * 8)); in w8rev()
385 static uint32_t w4rev(uint32_t const x) in w4rev() argument
387 return ((0xff & (x >> (0 * 8))) << (3 * 8)) in w4rev()
388 | ((0xff & (x >> (1 * 8))) << (2 * 8)) in w4rev()
389 | ((0xff & (x >> (2 * 8))) << (1 * 8)) in w4rev()
390 | ((0xff & (x >> (3 * 8))) << (0 * 8)); in w4rev()
393 static uint32_t w2rev(uint16_t const x) in w2rev() argument
395 return ((0xff & (x >> (0 * 8))) << (1 * 8)) in w2rev()
396 | ((0xff & (x >> (1 * 8))) << (0 * 8)); in w2rev()
399 static uint64_t w8nat(uint64_t const x) in w8nat() argument
401 return x; in w8nat()
404 static uint32_t w4nat(uint32_t const x) in w4nat() argument
406 return x; in w4nat()
409 static uint32_t w2nat(uint16_t const x) in w2nat() argument
411 return x; in w2nat()
439 static int arm_is_fake_mcount(Elf32_Rel const *rp) in arm_is_fake_mcount() argument
441 switch (ELF32_R_TYPE(w(rp->r_info))) { in arm_is_fake_mcount()
451 static int arm64_is_fake_mcount(Elf64_Rel const *rp) in arm64_is_fake_mcount() argument
453 return ELF64_R_TYPE(w8(rp->r_info)) != R_AARCH64_CALL26; in arm64_is_fake_mcount()
456 static int LARCH32_is_fake_mcount(Elf32_Rel const *rp) in LARCH32_is_fake_mcount() argument
458 switch (ELF64_R_TYPE(w(rp->r_info))) { in LARCH32_is_fake_mcount()
467 static int LARCH64_is_fake_mcount(Elf64_Rel const *rp) in LARCH64_is_fake_mcount() argument
469 switch (ELF64_R_TYPE(w(rp->r_info))) { in LARCH64_is_fake_mcount()
478 /* 64-bit EM_MIPS has weird ELF64_Rela.r_info.
479 * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf
486 typedef uint8_t myElf64_Byte; /* Type for a 8-bit quantity. */
499 static uint64_t MIPS64_r_sym(Elf64_Rel const *rp) in MIPS64_r_sym() argument
501 return w(((union mips_r_info){ .r_info = rp->r_info }).r_mips.r_sym); in MIPS64_r_sym()
504 static void MIPS64_r_info(Elf64_Rel *const rp, unsigned sym, unsigned type) in MIPS64_r_info() argument
506 rp->r_info = ((union mips_r_info){ in MIPS64_r_info()
515 int rc = -1; in do_file()
524 switch (ehdr->e_ident[EI_DATA]) { in do_file()
528 ehdr->e_ident[EI_DATA], fname); in do_file()
557 if (memcmp(ELFMAG, ehdr->e_ident, SELFMAG) != 0 || in do_file()
558 w2(ehdr->e_type) != ET_REL || in do_file()
559 ehdr->e_ident[EI_VERSION] != EV_CURRENT) { in do_file()
565 switch (w2(ehdr->e_machine)) { in do_file()
568 w2(ehdr->e_machine), fname); in do_file()
575 mcount_adjust_32 = -1; in do_file()
605 mcount_adjust_64 = -1; in do_file()
610 switch (ehdr->e_ident[EI_CLASS]) { in do_file()
613 ehdr->e_ident[EI_CLASS], fname); in do_file()
616 if (w2(ehdr->e_ehsize) != sizeof(Elf32_Ehdr) in do_file()
617 || w2(ehdr->e_shentsize) != sizeof(Elf32_Shdr)) { in do_file()
622 if (w2(ehdr->e_machine) == EM_MIPS) { in do_file()
626 if (w2(ehdr->e_machine) == EM_LOONGARCH) { in do_file()
635 if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr) in do_file()
636 || w2(ghdr->e_shentsize) != sizeof(Elf64_Shdr)) { in do_file()
641 if (w2(ghdr->e_machine) == EM_S390) { in do_file()
643 mcount_adjust_64 = -14; in do_file()
645 if (w2(ghdr->e_machine) == EM_MIPS) { in do_file()
651 if (w2(ghdr->e_machine) == EM_LOONGARCH) { in do_file()
671 int ftrace_size = sizeof(ftrace) - 1; in main()
672 int n_error = 0; /* gcc-4.3.0 false positive complaint */ in main()
682 fprintf(stderr, "usage: recordmcount [-w] file.o...\n"); in main()
687 if ((argc - optind) < 1) { in main()
688 fprintf(stderr, "usage: recordmcount [-w] file.o...\n"); in main()
704 strcmp(file + (len - ftrace_size), ftrace) == 0) in main()