Add -mno-shared to x86 assembler
On ELF target, the assembler normally generates code which can go into a shared library where non-weak symbols can be preempted. The -mno-shared option tells the assembler to generate code not for a shared library, where non-weak symbols won't be preempted. The resulting code is slightly smaller. This option mainly affects the handling of branch instructions. gas/ * config/tc-i386.c (no_shared): New. (OPTION_MNO_SHARED): Likewise. (elf_symbol_resolved_in_segment_p): Check no_shared. (md_longopts): Add mno-shared. (md_parse_option): Handle OPTION_MNO_SHARED. (md_show_usage): Add -mno-shared. * doc/c-i386.texi: Document -mno-shared. gas/testsuite/ * gas/i386/i386.exp: Run relax-4 and x86-64-relax-3. * gas/i386/relax-4.d: New file. * gas/i386/x86-64-relax-3.d: Likewise.
This commit is contained in:
parent
422349a385
commit
573cc2e57d
@ -1,3 +1,13 @@
|
||||
2015-05-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/tc-i386.c (no_shared): New.
|
||||
(OPTION_MNO_SHARED): Likewise.
|
||||
(elf_symbol_resolved_in_segment_p): Check no_shared.
|
||||
(md_longopts): Add mno-shared.
|
||||
(md_parse_option): Handle OPTION_MNO_SHARED.
|
||||
(md_show_usage): Add -mno-shared.
|
||||
* doc/c-i386.texi: Document -mno-shared.
|
||||
|
||||
2015-05-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/tc-i386.c (elf_symbol_resolved_in_segment_p): New.
|
||||
|
@ -524,6 +524,11 @@ static enum x86_elf_abi x86_elf_abi = I386_ABI;
|
||||
static int use_big_obj = 0;
|
||||
#endif
|
||||
|
||||
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||
/* 1 if not generating code for a shared library. */
|
||||
static int no_shared = 0;
|
||||
#endif
|
||||
|
||||
/* 1 for intel syntax,
|
||||
0 if att syntax. */
|
||||
static int intel_syntax = 0;
|
||||
@ -8785,6 +8790,10 @@ elf_symbol_resolved_in_segment_p (symbolS *fr_symbol)
|
||||
/* Symbol may be weak or local. */
|
||||
return !S_IS_WEAK (fr_symbol);
|
||||
|
||||
/* Non-weak symbols won't be preempted. */
|
||||
if (no_shared)
|
||||
return 1;
|
||||
|
||||
/* Global symbols with default visibility in a shared library may be
|
||||
preempted by another definition. */
|
||||
return ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT;
|
||||
@ -9484,6 +9493,7 @@ const char *md_shortopts = "qn";
|
||||
#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
|
||||
#define OPTION_OMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
|
||||
#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
|
||||
#define OPTION_MNO_SHARED (OPTION_MD_BASE + 21)
|
||||
|
||||
struct option md_longopts[] =
|
||||
{
|
||||
@ -9494,6 +9504,7 @@ struct option md_longopts[] =
|
||||
#endif
|
||||
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||
{"x32", no_argument, NULL, OPTION_X32},
|
||||
{"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
|
||||
#endif
|
||||
{"divide", no_argument, NULL, OPTION_DIVIDE},
|
||||
{"march", required_argument, NULL, OPTION_MARCH},
|
||||
@ -9554,6 +9565,10 @@ md_parse_option (int c, char *arg)
|
||||
/* -s: On i386 Solaris, this tells the native assembler to use
|
||||
.stab instead of .stab.excl. We always use .stab anyhow. */
|
||||
break;
|
||||
|
||||
case OPTION_MNO_SHARED:
|
||||
no_shared = 1;
|
||||
break;
|
||||
#endif
|
||||
#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
|
||||
|| defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
|
||||
@ -9980,6 +9995,8 @@ md_show_usage (FILE *stream)
|
||||
-mold-gcc support old (<= 2.8.1) versions of gcc\n"));
|
||||
fprintf (stream, _("\
|
||||
-madd-bnd-prefix add BND prefix for all valid branches\n"));
|
||||
fprintf (stream, _("\
|
||||
-mno-shared enable branch optimization for non shared code\n"));
|
||||
# if defined (TE_PE) || defined (TE_PEP)
|
||||
fprintf (stream, _("\
|
||||
-mbig-obj generate big object files\n"));
|
||||
|
@ -297,6 +297,16 @@ The @code{.att_syntax} and @code{.intel_syntax} directives will take precedent.
|
||||
This option forces the assembler to add BND prefix to all branches, even
|
||||
if such prefix was not explicitly specified in the source code.
|
||||
|
||||
@cindex @samp{-mno-shared} option, i386
|
||||
@cindex @samp{-mno-shared} option, x86-64
|
||||
@item -mno-shared
|
||||
On ELF target, the assembler normally generates code which can go into a
|
||||
shared library where non-weak symbols can be preempted. The
|
||||
@samp{-mno-shared} option tells the assembler to generate code not for
|
||||
a shared library, where non-weak symbols won't be preempted. The
|
||||
resulting code is slightly smaller. This option mainly affects the
|
||||
handling of branch instructions.
|
||||
|
||||
@cindex @samp{-mbig-obj} option, x86-64
|
||||
@item -mbig-obj
|
||||
On x86-64 PE/COFF target this option forces the use of big object file
|
||||
|
@ -1,3 +1,9 @@
|
||||
2015-05-08 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gas/i386/i386.exp: Run relax-4 and x86-64-relax-3.
|
||||
* gas/i386/relax-4.d: New file.
|
||||
* gas/i386/x86-64-relax-3.d: Likewise.
|
||||
|
||||
2015-05-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gas/i386/i386.exp: Run relax-3 and x86-64-relax-2.
|
||||
|
@ -396,6 +396,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
|
||||
run_dump_test "note"
|
||||
|
||||
run_dump_test "relax-3"
|
||||
run_dump_test "relax-4"
|
||||
}
|
||||
|
||||
# This is a PE specific test.
|
||||
@ -752,6 +753,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
|
||||
run_list_test "x86-64-size-inval-1" "-al"
|
||||
|
||||
run_dump_test "x86-64-relax-2"
|
||||
run_dump_test "x86-64-relax-3"
|
||||
}
|
||||
|
||||
set ASFLAGS "$old_ASFLAGS"
|
||||
|
32
gas/testsuite/gas/i386/relax-4.d
Normal file
32
gas/testsuite/gas/i386/relax-4.d
Normal file
@ -0,0 +1,32 @@
|
||||
#source: relax-3.s
|
||||
#as: -mno-shared
|
||||
#objdump: -dwr
|
||||
|
||||
.*: +file format .*
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
0+ <foo>:
|
||||
[ ]*[a-f0-9]+: eb 1c jmp 1e <local>
|
||||
[ ]*[a-f0-9]+: eb 16 jmp 1a <hidden_def>
|
||||
[ ]*[a-f0-9]+: eb 16 jmp 1c <global_def>
|
||||
[ ]*[a-f0-9]+: e9 fc ff ff ff jmp 7 <foo\+0x7> 7: (R_386_PC)?(DISP)?32 weak_def
|
||||
[ ]*[a-f0-9]+: e9 fc ff ff ff jmp c <foo\+0xc> c: (R_386_PC)?(DISP)?32 weak_hidden_undef
|
||||
[ ]*[a-f0-9]+: e9 fc ff ff ff jmp 11 <foo\+0x11> 11: (R_386_PC)?(DISP)?32 weak_hidden_def
|
||||
[ ]*[a-f0-9]+: e9 fc ff ff ff jmp 16 <foo\+0x16> 16: (R_386_PC)?(DISP)?32 hidden_undef
|
||||
|
||||
0+1a <hidden_def>:
|
||||
[ ]*[a-f0-9]+: c3 ret
|
||||
|
||||
0+1b <weak_hidden_def>:
|
||||
[ ]*[a-f0-9]+: c3 ret
|
||||
|
||||
0+1c <global_def>:
|
||||
[ ]*[a-f0-9]+: c3 ret
|
||||
|
||||
0+1d <weak_def>:
|
||||
[ ]*[a-f0-9]+: c3 ret
|
||||
|
||||
0+1e <local>:
|
||||
[ ]*[a-f0-9]+: c3 ret
|
||||
#pass
|
33
gas/testsuite/gas/i386/x86-64-relax-3.d
Normal file
33
gas/testsuite/gas/i386/x86-64-relax-3.d
Normal file
@ -0,0 +1,33 @@
|
||||
#source: relax-3.s
|
||||
#as: -mno-shared
|
||||
#objdump: -dwr
|
||||
|
||||
.*: +file format .*
|
||||
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
0+ <foo>:
|
||||
[ ]*[a-f0-9]+: eb 1c jmp 1e <local>
|
||||
[ ]*[a-f0-9]+: eb 16 jmp 1a <hidden_def>
|
||||
[ ]*[a-f0-9]+: eb 16 jmp 1c <global_def>
|
||||
[ ]*[a-f0-9]+: e9 00 00 00 00 jmpq b <foo\+0xb> 7: R_X86_64_PC32 weak_def-0x4
|
||||
[ ]*[a-f0-9]+: e9 00 00 00 00 jmpq 10 <foo\+0x10> c: R_X86_64_PC32 weak_hidden_undef-0x4
|
||||
[ ]*[a-f0-9]+: e9 00 00 00 00 jmpq 15 <foo\+0x15> 11: R_X86_64_PC32 weak_hidden_def-0x4
|
||||
[ ]*[a-f0-9]+: e9 00 00 00 00 jmpq 1a <hidden_def> 16: R_X86_64_PC32 hidden_undef-0x4
|
||||
|
||||
0+1a <hidden_def>:
|
||||
[ ]*[a-f0-9]+: c3 retq
|
||||
|
||||
0+1b <weak_hidden_def>:
|
||||
[ ]*[a-f0-9]+: c3 retq
|
||||
|
||||
0+1c <global_def>:
|
||||
[ ]*[a-f0-9]+: c3 retq
|
||||
|
||||
0+1d <weak_def>:
|
||||
[ ]*[a-f0-9]+: c3 retq
|
||||
|
||||
0+1e <local>:
|
||||
[ ]*[a-f0-9]+: c3 retq
|
||||
#pass
|
Loading…
x
Reference in New Issue
Block a user