* PowerPC64 --no-pcrel-optimize
@ 2020-08-12 22:45 Alan Modra
2020-08-17 16:44 ` Fangrui Song
0 siblings, 1 reply; 3+ messages in thread
From: Alan Modra @ 2020-08-12 22:45 UTC (permalink / raw)
To: binutils
This new option effectively ignores R_PPC64_PCREL_OPT, disabling the
optimization of instructions marked by that relocation. The patch
also disables GOT indirect to GOT/TOC pointer relative code editing
when --no-toc-optimize.
bfd/
* elf64-ppc.h (struct ppc64_elf_params): Add no_pcrel_opt.
* elf64-ppc.c (ppc64_elf_relocate_section): Disable GOT reloc
optimizations when --no-toc-optimize. Disable R_PPC64_PCREL_OPT
optimization when --no-pcrel-optimize.
ld/
* emultempl/ppc64elf.em (params): Init new field.
(enum ppc64_opt): Add OPTION_NO_PCREL_OPT.
(PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS),
(PARSE_AND_LIST_ARGS_CASES): Support --no-pcrel-optimize.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 4a75c25190..5cbf9acfcd 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -15903,7 +15903,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
break;
case R_PPC64_GOT16_DS:
- if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
+ if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
+ || !htab->do_toc_opt)
break;
from = TOCstart + htab->sec_info[input_section->id].toc_off;
if (relocation + addend - from + 0x8000 < 0x10000
@@ -15922,7 +15923,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
case R_PPC64_GOT16_LO_DS:
case R_PPC64_GOT16_HA:
- if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
+ if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
+ || !htab->do_toc_opt)
break;
from = TOCstart + htab->sec_info[input_section->id].toc_off;
if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
@@ -15945,34 +15947,38 @@ ppc64_elf_relocate_section (bfd *output_bfd,
break;
case R_PPC64_GOT_PCREL34:
- if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
+ if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
+ || !htab->do_toc_opt)
break;
from = (rel->r_offset
+ input_section->output_section->vma
+ input_section->output_offset);
- if (relocation - from + (1ULL << 33) < 1ULL << 34
- && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
- {
- offset = rel->r_offset;
- pinsn = bfd_get_32 (input_bfd, contents + offset);
- pinsn <<= 32;
- pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
- if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
- == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
- {
- /* Replace with paddi. */
- pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
- r_type = R_PPC64_PCREL34;
- rel->r_info = ELF64_R_INFO (r_symndx, r_type);
- bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
- bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
- goto pcrelopt;
- }
- }
- break;
+ if (!(relocation - from + (1ULL << 33) < 1ULL << 34
+ && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
+ break;
+
+ offset = rel->r_offset;
+ pinsn = bfd_get_32 (input_bfd, contents + offset);
+ pinsn <<= 32;
+ pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
+ if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
+ != ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
+ break;
+
+ /* Replace with paddi. */
+ pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
+ r_type = R_PPC64_PCREL34;
+ rel->r_info = ELF64_R_INFO (r_symndx, r_type);
+ bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
+ bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
+ /* Fall through. */
case R_PPC64_PCREL34:
- if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
+ if (!htab->params->no_pcrel_opt
+ && rel + 1 < relend
+ && rel[1].r_offset == rel->r_offset
+ && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT)
+ && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
{
offset = rel->r_offset;
pinsn = bfd_get_32 (input_bfd, contents + offset);
@@ -15982,43 +15988,37 @@ ppc64_elf_relocate_section (bfd *output_bfd,
== ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
| (14ULL << 26) /* paddi */))
{
- pcrelopt:
- if (rel + 1 < relend
- && rel[1].r_offset == offset
- && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
+ bfd_vma off2 = rel[1].r_addend;
+ if (off2 == 0)
+ /* zero means next insn. */
+ off2 = 8;
+ off2 += offset;
+ if (off2 + 4 <= input_section->size)
{
- bfd_vma off2 = rel[1].r_addend;
- if (off2 == 0)
- /* zero means next insn. */
- off2 = 8;
- off2 += offset;
- if (off2 + 4 <= input_section->size)
+ uint64_t pinsn2;
+ bfd_signed_vma addend_off;
+ pinsn2 = bfd_get_32 (input_bfd, contents + off2);
+ pinsn2 <<= 32;
+ if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
{
- uint64_t pinsn2;
- bfd_signed_vma addend_off;
- pinsn2 = bfd_get_32 (input_bfd, contents + off2);
- pinsn2 <<= 32;
+ if (off2 + 8 > input_section->size)
+ break;
+ pinsn2 |= bfd_get_32 (input_bfd,
+ contents + off2 + 4);
+ }
+ if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
+ {
+ addend += addend_off;
+ rel->r_addend = addend;
+ bfd_put_32 (input_bfd, pinsn >> 32,
+ contents + offset);
+ bfd_put_32 (input_bfd, pinsn,
+ contents + offset + 4);
+ bfd_put_32 (input_bfd, pinsn2 >> 32,
+ contents + off2);
if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
- {
- if (off2 + 8 > input_section->size)
- break;
- pinsn2 |= bfd_get_32 (input_bfd,
- contents + off2 + 4);
- }
- if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
- {
- addend += addend_off;
- rel->r_addend = addend;
- bfd_put_32 (input_bfd, pinsn >> 32,
- contents + offset);
- bfd_put_32 (input_bfd, pinsn,
- contents + offset + 4);
- bfd_put_32 (input_bfd, pinsn2 >> 32,
- contents + off2);
- if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
- bfd_put_32 (input_bfd, pinsn2,
- contents + off2 + 4);
- }
+ bfd_put_32 (input_bfd, pinsn2,
+ contents + off2 + 4);
}
}
}
diff --git a/bfd/elf64-ppc.h b/bfd/elf64-ppc.h
index 547971f8be..a7230de81c 100644
--- a/bfd/elf64-ppc.h
+++ b/bfd/elf64-ppc.h
@@ -57,6 +57,9 @@ struct ppc64_elf_params
/* Whether to use power10 instructions in linkage stubs. */
int power10_stubs;
+ /* Whether R_PPC64_PCREL_OPT should be ignored. */
+ int no_pcrel_opt;
+
/* Whether to canonicalize .opd so that there are no overlapping
.opd entries. */
int non_overlapping_opd;
diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
index 1331d03113..42b9bd48fc 100644
--- a/ld/emultempl/ppc64elf.em
+++ b/ld/emultempl/ppc64elf.em
@@ -38,7 +38,7 @@ static struct ppc64_elf_params params = { NULL,
&ppc_layout_sections_again,
1, -1, -1, 0,
${DEFAULT_PLT_STATIC_CHAIN-0}, -1, 5,
- -1, -1, 0, -1, -1, 0};
+ -1, -1, 0, 0, -1, -1, 0};
/* Fake input file for stubs. */
static lang_input_statement_type *stub_file;
@@ -686,6 +686,7 @@ enum ppc64_opt
OPTION_NO_PLT_LOCALENTRY,
OPTION_POWER10_STUBS,
OPTION_NO_POWER10_STUBS,
+ OPTION_NO_PCREL_OPT,
OPTION_STUBSYMS,
OPTION_NO_STUBSYMS,
OPTION_SAVRES,
@@ -717,6 +718,7 @@ PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
{ "plt-localentry", optional_argument, NULL, OPTION_PLT_LOCALENTRY },
{ "no-plt-localentry", no_argument, NULL, OPTION_NO_PLT_LOCALENTRY },
{ "power10-stubs", optional_argument, NULL, OPTION_POWER10_STUBS },
+ { "no-pcrel-optimize", no_argument, NULL, OPTION_NO_PCREL_OPT },
{ "no-power10-stubs", no_argument, NULL, OPTION_NO_POWER10_STUBS },
{ "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
{ "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
@@ -776,6 +778,9 @@ PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
--power10-stubs [=auto] Use Power10 PLT call stubs (default auto)\n"
));
fprintf (file, _("\
+ --no-pcrel-optimize Don'\''t perform R_PPC64_PCREL_OPT optimization\n"
+ ));
+ fprintf (file, _("\
--no-power10-stubs Don'\''t use Power10 PLT call stubs\n"
));
fprintf (file, _("\
@@ -909,6 +914,10 @@ PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
params.power10_stubs = 0;
break;
+ case OPTION_NO_PCREL_OPT:
+ params.no_pcrel_opt = 1;
+ break;
+
case OPTION_STUBSYMS:
params.emit_stub_syms = 1;
break;
@@ -985,6 +994,7 @@ PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
params.no_multi_toc = 1;
no_toc_sort = 1;
params.plt_static_chain = 1;
+ params.no_pcrel_opt = 1;
return FALSE;
'
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: PowerPC64 --no-pcrel-optimize
2020-08-12 22:45 PowerPC64 --no-pcrel-optimize Alan Modra
@ 2020-08-17 16:44 ` Fangrui Song
2020-08-18 6:32 ` Alan Modra
0 siblings, 1 reply; 3+ messages in thread
From: Fangrui Song @ 2020-08-17 16:44 UTC (permalink / raw)
To: Alan Modra; +Cc: binutils
On 2020-08-13, Alan Modra via Binutils wrote:
>This new option effectively ignores R_PPC64_PCREL_OPT, disabling the
>optimization of instructions marked by that relocation. The patch
>also disables GOT indirect to GOT/TOC pointer relative code editing
>when --no-toc-optimize.
>
>bfd/
> * elf64-ppc.h (struct ppc64_elf_params): Add no_pcrel_opt.
> * elf64-ppc.c (ppc64_elf_relocate_section): Disable GOT reloc
> optimizations when --no-toc-optimize. Disable R_PPC64_PCREL_OPT
> optimization when --no-pcrel-optimize.
>ld/
> * emultempl/ppc64elf.em (params): Init new field.
> (enum ppc64_opt): Add OPTION_NO_PCREL_OPT.
> (PARSE_AND_LIST_LONGOPTS, PARSE_AND_LIST_OPTIONS),
> (PARSE_AND_LIST_ARGS_CASES): Support --no-pcrel-optimize.
>
>diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
>index 4a75c25190..5cbf9acfcd 100644
>--- a/bfd/elf64-ppc.c
>+++ b/bfd/elf64-ppc.c
>@@ -15903,7 +15903,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
> break;
>
> case R_PPC64_GOT16_DS:
>- if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
>+ if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
>+ || !htab->do_toc_opt)
> break;
> from = TOCstart + htab->sec_info[input_section->id].toc_off;
> if (relocation + addend - from + 0x8000 < 0x10000
>@@ -15922,7 +15923,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
>
> case R_PPC64_GOT16_LO_DS:
> case R_PPC64_GOT16_HA:
>- if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
>+ if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
>+ || !htab->do_toc_opt)
> break;
> from = TOCstart + htab->sec_info[input_section->id].toc_off;
> if (relocation + addend - from + 0x80008000ULL < 0x100000000ULL
>@@ -15945,34 +15947,38 @@ ppc64_elf_relocate_section (bfd *output_bfd,
> break;
>
> case R_PPC64_GOT_PCREL34:
>- if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC)
>+ if ((h ? h->elf.type : ELF_ST_TYPE (sym->st_info)) == STT_GNU_IFUNC
>+ || !htab->do_toc_opt)
> break;
> from = (rel->r_offset
> + input_section->output_section->vma
> + input_section->output_offset);
>- if (relocation - from + (1ULL << 33) < 1ULL << 34
>- && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
>- {
>- offset = rel->r_offset;
>- pinsn = bfd_get_32 (input_bfd, contents + offset);
>- pinsn <<= 32;
>- pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
>- if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
>- == ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
>- {
>- /* Replace with paddi. */
>- pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
>- r_type = R_PPC64_PCREL34;
>- rel->r_info = ELF64_R_INFO (r_symndx, r_type);
>- bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
>- bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
>- goto pcrelopt;
>- }
>- }
>- break;
>+ if (!(relocation - from + (1ULL << 33) < 1ULL << 34
>+ && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
>+ break;
>+
>+ offset = rel->r_offset;
>+ pinsn = bfd_get_32 (input_bfd, contents + offset);
>+ pinsn <<= 32;
>+ pinsn |= bfd_get_32 (input_bfd, contents + offset + 4);
>+ if ((pinsn & ((-1ULL << 50) | (63ULL << 26)))
>+ != ((1ULL << 58) | (1ULL << 52) | (57ULL << 26) /* pld */))
>+ break;
>+
>+ /* Replace with paddi. */
>+ pinsn += (2ULL << 56) + (14ULL << 26) - (57ULL << 26);
>+ r_type = R_PPC64_PCREL34;
>+ rel->r_info = ELF64_R_INFO (r_symndx, r_type);
>+ bfd_put_32 (input_bfd, pinsn >> 32, contents + offset);
>+ bfd_put_32 (input_bfd, pinsn, contents + offset + 4);
>+ /* Fall through. */
>
> case R_PPC64_PCREL34:
>- if (SYMBOL_REFERENCES_LOCAL (info, &h->elf))
>+ if (!htab->params->no_pcrel_opt
>+ && rel + 1 < relend
>+ && rel[1].r_offset == rel->r_offset
>+ && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT)
>+ && SYMBOL_REFERENCES_LOCAL (info, &h->elf))
> {
> offset = rel->r_offset;
> pinsn = bfd_get_32 (input_bfd, contents + offset);
>@@ -15982,43 +15988,37 @@ ppc64_elf_relocate_section (bfd *output_bfd,
> == ((1ULL << 58) | (2ULL << 56) | (1ULL << 52)
> | (14ULL << 26) /* paddi */))
> {
>- pcrelopt:
>- if (rel + 1 < relend
>- && rel[1].r_offset == offset
>- && rel[1].r_info == ELF64_R_INFO (0, R_PPC64_PCREL_OPT))
>+ bfd_vma off2 = rel[1].r_addend;
>+ if (off2 == 0)
>+ /* zero means next insn. */
>+ off2 = 8;
>+ off2 += offset;
>+ if (off2 + 4 <= input_section->size)
> {
>- bfd_vma off2 = rel[1].r_addend;
>- if (off2 == 0)
>- /* zero means next insn. */
>- off2 = 8;
>- off2 += offset;
>- if (off2 + 4 <= input_section->size)
>+ uint64_t pinsn2;
>+ bfd_signed_vma addend_off;
>+ pinsn2 = bfd_get_32 (input_bfd, contents + off2);
>+ pinsn2 <<= 32;
>+ if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
> {
>- uint64_t pinsn2;
>- bfd_signed_vma addend_off;
>- pinsn2 = bfd_get_32 (input_bfd, contents + off2);
>- pinsn2 <<= 32;
>+ if (off2 + 8 > input_section->size)
>+ break;
>+ pinsn2 |= bfd_get_32 (input_bfd,
>+ contents + off2 + 4);
>+ }
>+ if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
>+ {
>+ addend += addend_off;
>+ rel->r_addend = addend;
>+ bfd_put_32 (input_bfd, pinsn >> 32,
>+ contents + offset);
>+ bfd_put_32 (input_bfd, pinsn,
>+ contents + offset + 4);
>+ bfd_put_32 (input_bfd, pinsn2 >> 32,
>+ contents + off2);
> if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
>- {
>- if (off2 + 8 > input_section->size)
>- break;
>- pinsn2 |= bfd_get_32 (input_bfd,
>- contents + off2 + 4);
>- }
>- if (xlate_pcrel_opt (&pinsn, &pinsn2, &addend_off))
>- {
>- addend += addend_off;
>- rel->r_addend = addend;
>- bfd_put_32 (input_bfd, pinsn >> 32,
>- contents + offset);
>- bfd_put_32 (input_bfd, pinsn,
>- contents + offset + 4);
>- bfd_put_32 (input_bfd, pinsn2 >> 32,
>- contents + off2);
>- if ((pinsn2 & (63ULL << 58)) == 1ULL << 58)
>- bfd_put_32 (input_bfd, pinsn2,
>- contents + off2 + 4);
>- }
>+ bfd_put_32 (input_bfd, pinsn2,
>+ contents + off2 + 4);
> }
> }
> }
>diff --git a/bfd/elf64-ppc.h b/bfd/elf64-ppc.h
>index 547971f8be..a7230de81c 100644
>--- a/bfd/elf64-ppc.h
>+++ b/bfd/elf64-ppc.h
>@@ -57,6 +57,9 @@ struct ppc64_elf_params
> /* Whether to use power10 instructions in linkage stubs. */
> int power10_stubs;
>
>+ /* Whether R_PPC64_PCREL_OPT should be ignored. */
>+ int no_pcrel_opt;
>+
> /* Whether to canonicalize .opd so that there are no overlapping
> .opd entries. */
> int non_overlapping_opd;
>diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
>index 1331d03113..42b9bd48fc 100644
>--- a/ld/emultempl/ppc64elf.em
>+++ b/ld/emultempl/ppc64elf.em
>@@ -38,7 +38,7 @@ static struct ppc64_elf_params params = { NULL,
> &ppc_layout_sections_again,
> 1, -1, -1, 0,
> ${DEFAULT_PLT_STATIC_CHAIN-0}, -1, 5,
>- -1, -1, 0, -1, -1, 0};
>+ -1, -1, 0, 0, -1, -1, 0};
>
> /* Fake input file for stubs. */
> static lang_input_statement_type *stub_file;
>@@ -686,6 +686,7 @@ enum ppc64_opt
> OPTION_NO_PLT_LOCALENTRY,
> OPTION_POWER10_STUBS,
> OPTION_NO_POWER10_STUBS,
>+ OPTION_NO_PCREL_OPT,
> OPTION_STUBSYMS,
> OPTION_NO_STUBSYMS,
> OPTION_SAVRES,
>@@ -717,6 +718,7 @@ PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
> { "plt-localentry", optional_argument, NULL, OPTION_PLT_LOCALENTRY },
> { "no-plt-localentry", no_argument, NULL, OPTION_NO_PLT_LOCALENTRY },
> { "power10-stubs", optional_argument, NULL, OPTION_POWER10_STUBS },
>+ { "no-pcrel-optimize", no_argument, NULL, OPTION_NO_PCREL_OPT },
> { "no-power10-stubs", no_argument, NULL, OPTION_NO_POWER10_STUBS },
> { "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
> { "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
>@@ -776,6 +778,9 @@ PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
> --power10-stubs [=auto] Use Power10 PLT call stubs (default auto)\n"
> ));
> fprintf (file, _("\
>+ --no-pcrel-optimize Don'\''t perform R_PPC64_PCREL_OPT optimization\n"
>+ ));
>+ fprintf (file, _("\
> --no-power10-stubs Don'\''t use Power10 PLT call stubs\n"
> ));
> fprintf (file, _("\
>@@ -909,6 +914,10 @@ PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
> params.power10_stubs = 0;
> break;
>
>+ case OPTION_NO_PCREL_OPT:
>+ params.no_pcrel_opt = 1;
>+ break;
>+
> case OPTION_STUBSYMS:
> params.emit_stub_syms = 1;
> break;
>@@ -985,6 +994,7 @@ PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
> params.no_multi_toc = 1;
> no_toc_sort = 1;
> params.plt_static_chain = 1;
>+ params.no_pcrel_opt = 1;
> return FALSE;
> '
>
>
>--
>Alan Modra
>Australia Development Lab, IBM
For newer options I suggest they have the EXACTLY_TWO_DASHES flag to
avoid unnecessary collision with grouped short options.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: PowerPC64 --no-pcrel-optimize
2020-08-17 16:44 ` Fangrui Song
@ 2020-08-18 6:32 ` Alan Modra
0 siblings, 0 replies; 3+ messages in thread
From: Alan Modra @ 2020-08-18 6:32 UTC (permalink / raw)
To: Fangrui Song; +Cc: binutils
On Mon, Aug 17, 2020 at 09:44:17AM -0700, Fangrui Song wrote:
> For newer options I suggest they have the EXACTLY_TWO_DASHES flag to
> avoid unnecessary collision with grouped short options.
Not a bad idea, but requires a little more infrastructure. At the
moment target options are just a "struct option", without any means to
select whether they should be used with getopt_long or
getopt_long_only.
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-08-18 6:32 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-12 22:45 PowerPC64 --no-pcrel-optimize Alan Modra
2020-08-17 16:44 ` Fangrui Song
2020-08-18 6:32 ` Alan Modra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).