Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
39dd8003
Commit
39dd8003
authored
Sep 20, 1999
by
Nick Clifton
Committed by
Nick Clifton
Sep 20, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Pass all command line options to both language dependent and language independent
decoders. From-SVN: r29520
parent
558389e3
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
605 additions
and
564 deletions
+605
-564
gcc/ChangeLog
+20
-0
gcc/toplev.c
+585
-564
No files found.
gcc/ChangeLog
View file @
39dd8003
Mon
Sep
20
14
:
43
:
37
1999
Nick
Clifton
<
nickc
@cygnus
.
com
>
*
toplev
.
c
(
progname
)
:
Make
'
const
char
*
'
(
flag_print_mem
)
:
Move
out
of
main
.
(
version_flag
)
:
Move
out
of
main
.
(
filename
)
:
Move
out
of
main
.
(
debug_args
)
:
Remove
g
prefix
from
options
.
(
documented_lang_options
)
:
Remove
cpplib
specific
options
.
(
display_help
)
:
Add
g
prefix
to
debug
options
.
(
check_lang_option
)
:
Delete
this
function
.
(
decode_d_option
)
:
New
function
:
Decode
-
d
...
option
.
(
decode_f_option
)
:
New
function
:
Decode
-
f
...
option
.
(
decode_W_option
)
:
New
function
:
Decode
-
W
...
option
.
(
decode_g_option
)
:
New
function
:
Decode
-
g
...
option
.
(
independent_decode_option
)
:
New
function
:
Decode
a
language
independent
command
line
option
.
(
main
)
:
Invoke
lang_decode_option
and
then
independent_decode_option
on
each
command
line
option
in
turn
.
Mon
Sep
20
05
:
41
:
36
1999
Jeffrey
A
Law
(
law
@cygnus
.
com
)
*
flow
.
c
(
merge_blocks_move_predecessor_nojumps
)
:
New
function
.
...
...
gcc/toplev.c
View file @
39dd8003
...
...
@@ -192,6 +192,12 @@ static void report_file_and_line PROTO ((const char *, int, int));
static
void
vnotice
PROTO
((
FILE
*
,
const
char
*
,
va_list
));
static
void
mark_file_stack
PROTO
((
void
*
));
static
void
decode_d_option
PROTO
((
const
char
*
));
static
int
decode_f_option
PROTO
((
const
char
*
));
static
int
decode_W_option
PROTO
((
const
char
*
));
static
int
decode_g_option
PROTO
((
const
char
*
));
static
unsigned
independent_decode_option
PROTO
((
int
,
char
**
,
unsigned
));
static
void
print_version
PROTO
((
FILE
*
,
const
char
*
));
static
int
print_single_switch
PROTO
((
FILE
*
,
int
,
int
,
const
char
*
,
const
char
*
,
const
char
*
,
...
...
@@ -279,6 +285,9 @@ int stack_reg_dump = 0;
#ifdef MACHINE_DEPENDENT_REORG
int
mach_dep_reorg_dump
=
0
;
#endif
static
int
flag_print_mem
=
0
;
static
int
version_flag
=
0
;
static
char
*
filename
=
0
;
enum
graph_dump_types
graph_dump_format
;
/* Name for output file of assembly code, specified with -o. */
...
...
@@ -767,27 +776,27 @@ static struct
}
*
da
,
debug_args
[]
=
{
{
"
g"
,
NO_DEBUG
,
DEFAULT_GDB_EXTENSIONS
,
{
"
"
,
NO_DEBUG
,
DEFAULT_GDB_EXTENSIONS
,
"Generate default debug format output"
},
{
"g
gdb"
,
NO_DEBUG
,
1
,
"Generate default extended debug format output"
},
{
"g
db"
,
NO_DEBUG
,
1
,
"Generate default extended debug format output"
},
#ifdef DBX_DEBUGGING_INFO
{
"
g
stabs"
,
DBX_DEBUG
,
0
,
"Generate STABS format debug output"
},
{
"
g
stabs+"
,
DBX_DEBUG
,
1
,
"Generate extended STABS format debug output"
},
{
"stabs"
,
DBX_DEBUG
,
0
,
"Generate STABS format debug output"
},
{
"stabs+"
,
DBX_DEBUG
,
1
,
"Generate extended STABS format debug output"
},
#endif
#ifdef DWARF_DEBUGGING_INFO
{
"
g
dwarf"
,
DWARF_DEBUG
,
0
,
"Generate DWARF-1 format debug output"
},
{
"
g
dwarf+"
,
DWARF_DEBUG
,
1
,
{
"dwarf"
,
DWARF_DEBUG
,
0
,
"Generate DWARF-1 format debug output"
},
{
"dwarf+"
,
DWARF_DEBUG
,
1
,
"Generated extended DWARF-1 format debug output"
},
#endif
#ifdef DWARF2_DEBUGGING_INFO
{
"
g
dwarf-2"
,
DWARF2_DEBUG
,
0
,
"Enable DWARF-2 debug output"
},
{
"dwarf-2"
,
DWARF2_DEBUG
,
0
,
"Enable DWARF-2 debug output"
},
#endif
#ifdef XCOFF_DEBUGGING_INFO
{
"
g
xcoff"
,
XCOFF_DEBUG
,
0
,
"Generate XCOFF format debug output"
},
{
"
g
xcoff+"
,
XCOFF_DEBUG
,
1
,
"Generate extended XCOFF format debug output"
},
{
"xcoff"
,
XCOFF_DEBUG
,
0
,
"Generate XCOFF format debug output"
},
{
"xcoff+"
,
XCOFF_DEBUG
,
1
,
"Generate extended XCOFF format debug output"
},
#endif
#ifdef SDB_DEBUGGING_INFO
{
"
g
coff"
,
SDB_DEBUG
,
0
,
"Generate COFF format debug output"
},
{
"coff"
,
SDB_DEBUG
,
0
,
"Generate COFF format debug output"
},
#endif
{
0
,
0
,
0
,
0
}
};
...
...
@@ -1095,40 +1104,10 @@ documented_lang_options[] =
{
"-Wno-undef"
,
""
},
{
"-Wwrite-strings"
,
"Mark strings as 'const char *'"
},
{
"-Wno-write-strings"
,
""
},
/* These are for languages with USE_CPPLIB. */
/* These options are already documented in cpplib.c */
{
"--help"
,
""
},
{
"-A"
,
""
},
{
"-D"
,
""
},
{
"-I"
,
""
},
#if USE_CPPLIB
{
"-MD"
,
"Print dependencies to FILE.d"
},
{
"-MMD"
,
"Print dependencies to FILE.d"
},
{
"-M"
,
"Print dependencies to stdout"
},
{
"-MM"
,
"Print dependencies to stdout"
},
#endif
/* USE_CPPLIB */
{
"-U"
,
""
},
{
"-H"
,
""
},
{
"-idirafter"
,
""
},
{
"-imacros"
,
""
},
{
"-include"
,
""
},
{
"-iprefix"
,
""
},
{
"-isystem"
,
""
},
{
"-iwithprefix"
,
""
},
{
"-iwithprefixbefore"
,
""
},
{
"-lang-c"
,
""
},
{
"-lang-c89"
,
""
},
{
"-lang-c++"
,
""
},
{
"-remap"
,
""
},
{
"-nostdinc"
,
""
},
{
"-nostdinc++"
,
""
},
{
"-trigraphs"
,
""
},
{
"-undef"
,
""
},
#define DEFINE_LANG_NAME(NAME) { NULL, NAME },
/* These are for
obj c
. */
/* These are for
Objective C
. */
DEFINE_LANG_NAME
(
"Objective C"
)
{
"-lang-objc"
,
""
},
...
...
@@ -1911,16 +1890,16 @@ error VPROTO((const char *msgid, ...))
va_end
(
ap
);
}
/* Report a fatal error at the current line number.
Allow a front end to
/* Report a fatal error at the current line number. Allow a front end to
intercept the message. */
static
void
(
*
fatal_function
)
PROTO
((
const
char
*
,
va_list
));
static
void
(
*
fatal_function
)
PROTO
((
const
char
*
,
va_list
));
/* Set the function to call when a fatal error occurs. */
void
set_fatal_function
(
f
)
void
(
*
f
)
PROTO
((
const
char
*
,
va_list
));
void
(
*
f
)
PROTO
((
const
char
*
,
va_list
));
{
fatal_function
=
f
;
}
...
...
@@ -4516,7 +4495,7 @@ display_help ()
for
(
i
=
NUM_ELEM
(
debug_args
);
i
--
;)
{
if
(
debug_args
[
i
].
description
!=
NULL
)
printf
(
" -
%-22
s %s
\n
"
,
debug_args
[
i
].
arg
,
debug_args
[
i
].
description
);
printf
(
" -
g%-21
s %s
\n
"
,
debug_args
[
i
].
arg
,
debug_args
[
i
].
description
);
}
printf
(
" -aux-info <file> Emit declaration info into <file>.X
\n
"
);
...
...
@@ -4636,74 +4615,569 @@ display_help ()
}
}
}
/* Parse a -d... comand line switch. */
/* Compare the user specified 'option' with the language
specific 'lang_option'. Return true if they match, or
if 'option' is a viable prefix of 'lang_option'. */
static
void
decode_d_option
(
arg
)
const
char
*
arg
;
{
while
(
*
arg
)
switch
(
*
arg
++
)
{
case
'a'
:
branch_prob_dump
=
1
;
combine_dump
=
1
;
#ifdef DELAY_SLOTS
dbr_sched_dump
=
1
;
#endif
flow_dump
=
1
;
flow2_dump
=
1
;
global_reg_dump
=
1
;
jump_opt_dump
=
1
;
addressof_dump
=
1
;
jump2_opt_dump
=
1
;
local_reg_dump
=
1
;
loop_dump
=
1
;
regmove_dump
=
1
;
rtl_dump
=
1
;
cse_dump
=
1
;
cse2_dump
=
1
;
gcse_dump
=
1
;
sched_dump
=
1
;
sched2_dump
=
1
;
#ifdef STACK_REGS
stack_reg_dump
=
1
;
#endif
#ifdef MACHINE_DEPENDENT_REORG
mach_dep_reorg_dump
=
1
;
#endif
peephole2_dump
=
1
;
break
;
case
'A'
:
flag_debug_asm
=
1
;
break
;
case
'b'
:
branch_prob_dump
=
1
;
break
;
case
'c'
:
combine_dump
=
1
;
break
;
#ifdef DELAY_SLOTS
case
'd'
:
dbr_sched_dump
=
1
;
break
;
#endif
case
'f'
:
flow_dump
=
1
;
break
;
case
'F'
:
addressof_dump
=
1
;
break
;
case
'g'
:
global_reg_dump
=
1
;
break
;
case
'G'
:
gcse_dump
=
1
;
break
;
case
'j'
:
jump_opt_dump
=
1
;
break
;
case
'J'
:
jump2_opt_dump
=
1
;
break
;
#ifdef STACK_REGS
case
'k'
:
stack_reg_dump
=
1
;
break
;
#endif
case
'l'
:
local_reg_dump
=
1
;
break
;
case
'L'
:
loop_dump
=
1
;
break
;
case
'm'
:
flag_print_mem
=
1
;
break
;
#ifdef MACHINE_DEPENDENT_REORG
case
'M'
:
mach_dep_reorg_dump
=
1
;
break
;
#endif
case
'p'
:
flag_print_asm_name
=
1
;
break
;
case
'r'
:
rtl_dump
=
1
;
break
;
case
'R'
:
sched2_dump
=
1
;
break
;
case
's'
:
cse_dump
=
1
;
break
;
case
'S'
:
sched_dump
=
1
;
break
;
case
't'
:
cse2_dump
=
1
;
break
;
case
'N'
:
regmove_dump
=
1
;
break
;
case
'v'
:
graph_dump_format
=
vcg
;
break
;
case
'w'
:
flow2_dump
=
1
;
break
;
case
'x'
:
rtl_dump_and_exit
=
1
;
break
;
case
'y'
:
set_yydebug
(
1
);
break
;
case
'z'
:
peephole2_dump
=
1
;
break
;
case
'D'
:
/* These are handled by the preprocessor. */
case
'I'
:
break
;
default
:
warning
(
"unrecognised gcc debugging option: %c"
,
arg
[
-
1
]);
break
;
}
}
/* Parse a -f... comand line switch. ARG is the value after the -f.
It is safe to access 'ARG - 2' to generate the full switch name.
Return the number of strings consumed. */
static
int
check_lang_option
(
option
,
lang_option
)
const
char
*
option
;
const
char
*
lang_option
;
decode_f_option
(
arg
)
const
char
*
arg
;
{
lang_independent_options
*
indep_options
;
int
len
;
long
k
;
const
char
*
space
;
/* Ignore NULL entries. */
if
(
option
==
NULL
||
lang_option
==
NULL
)
return
0
;
int
j
;
if
((
space
=
strchr
(
lang_option
,
' '
))
!=
NULL
)
len
=
space
-
lang_option
;
/* Search for the option in the table of binary f options. */
for
(
j
=
sizeof
(
f_options
)
/
sizeof
(
f_options
[
0
]);
j
--
;)
{
if
(
!
strcmp
(
arg
,
f_options
[
j
].
string
))
{
*
f_options
[
j
].
variable
=
f_options
[
j
].
on_value
;
return
1
;
}
if
(
arg
[
0
]
==
'n'
&&
arg
[
1
]
==
'o'
&&
arg
[
2
]
==
'-'
&&
!
strcmp
(
arg
+
3
,
f_options
[
j
].
string
))
{
*
f_options
[
j
].
variable
=
!
f_options
[
j
].
on_value
;
return
1
;
}
}
if
(
!
strncmp
(
arg
,
"inline-limit-"
,
13
)
||
!
strncmp
(
arg
,
"inline-limit="
,
13
))
inline_max_insns
=
read_integral_parameter
(
arg
+
13
,
arg
-
2
,
inline_max_insns
);
#ifdef INSN_SCHEDULING
else
if
(
!
strncmp
(
arg
,
"sched-verbose="
,
14
))
fix_sched_param
(
"verbose"
,
(
char
*
)(
arg
+
14
));
#endif
else
if
(
!
strncmp
(
arg
,
"fixed-"
,
6
))
fix_register
((
char
*
)(
arg
+
6
),
1
,
1
);
else
if
(
!
strncmp
(
arg
,
"call-used-"
,
10
))
fix_register
((
char
*
)(
arg
+
10
),
0
,
1
);
else
if
(
!
strncmp
(
arg
,
"call-saved-"
,
11
))
fix_register
((
char
*
)(
arg
+
11
),
0
,
0
);
else
if
(
!
strncmp
(
arg
,
"align-loops="
,
12
))
align_loops
=
read_integral_parameter
(
arg
+
12
,
arg
-
2
,
align_loops
);
else
if
(
!
strncmp
(
arg
,
"align-functions="
,
16
))
align_functions
=
read_integral_parameter
(
arg
+
16
,
arg
-
2
,
align_functions
);
else
if
(
!
strncmp
(
arg
,
"align-jumps="
,
12
))
align_jumps
=
read_integral_parameter
(
arg
+
12
,
arg
-
2
,
align_jumps
);
else
if
(
!
strncmp
(
arg
,
"align-labels="
,
13
))
align_labels
=
read_integral_parameter
(
arg
+
13
,
arg
-
2
,
align_labels
);
else
if
(
!
strcmp
(
arg
,
"preprocessed"
))
/* Recognise this switch but do nothing. This prevents warnings
about an unrecognised switch if cpplib has not been linked in. */
;
else
len
=
strlen
(
lang_option
);
return
0
;
return
1
;
}
/* Parse a -W... comand line switch. ARG is the value after the -W.
It is safe to access 'ARG - 2' to generate the full switch name.
Return the number of strings consumed. */
static
int
decode_W_option
(
arg
)
const
char
*
arg
;
{
int
j
;
/* If they do not match to the first n characters then fail. */
if
(
strncmp
(
option
,
lang_option
,
len
)
!=
0
)
/* Search for the option in the table of binary W options. */
for
(
j
=
sizeof
(
W_options
)
/
sizeof
(
W_options
[
0
]);
j
--
;)
{
if
(
!
strcmp
(
arg
,
W_options
[
j
].
string
))
{
*
W_options
[
j
].
variable
=
W_options
[
j
].
on_value
;
return
1
;
}
if
(
arg
[
0
]
==
'n'
&&
arg
[
1
]
==
'o'
&&
arg
[
2
]
==
'-'
&&
!
strcmp
(
arg
+
3
,
W_options
[
j
].
string
))
{
*
W_options
[
j
].
variable
=
!
W_options
[
j
].
on_value
;
return
1
;
}
}
if
(
!
strncmp
(
arg
,
"id-clash-"
,
9
))
{
const
int
id_clash_val
=
read_integral_parameter
(
arg
+
9
,
arg
-
2
,
-
1
);
if
(
id_clash_val
!=
-
1
)
{
id_clash_len
=
id_clash_val
;
warn_id_clash
=
1
;
}
}
else
if
(
!
strncmp
(
arg
,
"larger-than-"
,
12
))
{
const
int
larger_than_val
=
read_integral_parameter
(
arg
+
12
,
arg
-
2
,
-
1
);
if
(
larger_than_val
!=
-
1
)
{
larger_than_size
=
larger_than_val
;
warn_larger_than
=
1
;
}
}
else
return
0
;
return
1
;
}
/* Parse a -g... comand line switch. ARG is the value after the -g.
It is safe to access 'ARG - 2' to generate the full switch name.
Return the number of strings consumed. */
static
int
decode_g_option
(
arg
)
const
char
*
arg
;
{
unsigned
level
;
/* A lot of code assumes write_symbols == NO_DEBUG if the
debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
of what debugging type has been selected). This records the
selected type. It is an error to specify more than one
debugging type. */
static
enum
debug_info_type
selected_debug_type
=
NO_DEBUG
;
/* Non-zero if debugging format has been explicitly set.
-g and -ggdb don't explicitly set the debugging format so
-gdwarf -g3 is equivalent to -gdwarf3. */
static
int
type_explicitly_set_p
=
0
;
/* Indexed by enum debug_info_type. */
static
const
char
*
debug_type_names
[]
=
{
"none"
,
"stabs"
,
"coff"
,
"dwarf-1"
,
"dwarf-2"
,
"xcoff"
};
/* Do not accept a lang option, if it matches a normal -f or -W
option. Chill defines a -fpack, but we want to support
-fpack-struct. */
/* The maximum admissible debug level value. */
static
const
unsigned
max_debug_level
=
3
;
/* An exact match is OK */
if
((
int
)
strlen
(
option
)
==
len
)
return
1
;
/* Look up ARG in the table. */
for
(
da
=
debug_args
;
da
->
arg
;
da
++
)
{
const
int
da_len
=
strlen
(
da
->
arg
);
if
(
da_len
==
0
||
!
strncmp
(
arg
,
da
->
arg
,
da_len
))
{
enum
debug_info_type
type
=
da
->
debug_type
;
const
char
*
p
=
arg
+
da_len
;
if
(
*
p
&&
(
*
p
<
'0'
||
*
p
>
'9'
))
continue
;
/* A debug flag without a level defaults to level 2.
Note we do not want to call read_integral_parameter
for that case since it will call atoi which
will return zero.
??? We may want to generalize the interface to
read_integral_parameter to better handle this case
if this case shows up often. */
if
(
*
p
)
level
=
read_integral_parameter
(
p
,
0
,
max_debug_level
+
1
);
else
level
=
2
;
if
(
da_len
>
1
&&
*
p
&&
!
strncmp
(
arg
,
"dwarf"
,
da_len
))
{
error
(
"use -gdwarf -g%d for DWARF v1, level %d"
,
level
,
level
);
if
(
level
==
2
)
error
(
"use -gdwarf-2 for DWARF v2"
);
}
if
(
level
>
max_debug_level
)
{
warning
(
"\
ignoring option `%s' due to invalid debug level specification"
,
arg
-
2
);
level
=
debug_info_level
;
}
if
(
type
==
NO_DEBUG
)
{
type
=
PREFERRED_DEBUGGING_TYPE
;
if
(
da_len
>
1
&&
strncmp
(
arg
,
"gdb"
,
da_len
)
==
0
)
{
#if defined (DWARF2_DEBUGGING_INFO) && !defined (LINKER_DOES_NOT_WORK_WITH_DWARF2)
type
=
DWARF2_DEBUG
;
#else
#ifdef DBX_DEBUGGING_INFO
type
=
DBX_DEBUG
;
#endif
#endif
}
}
if
(
type
==
NO_DEBUG
)
warning
(
"`%s' not supported by this configuration of GCC"
,
arg
-
2
);
/* Does it conflict with an already selected type? */
if
(
type_explicitly_set_p
/* -g/-ggdb don't conflict with anything */
&&
da
->
debug_type
!=
NO_DEBUG
&&
type
!=
selected_debug_type
)
warning
(
"`%s' ignored, conflicts with `-g%s'"
,
arg
-
2
,
debug_type_names
[(
int
)
selected_debug_type
]);
else
{
/* If the format has already been set, -g/-ggdb
only change the debug level. */
if
(
type_explicitly_set_p
&&
da
->
debug_type
==
NO_DEBUG
)
;
/* don't change debugging type */
else
{
selected_debug_type
=
type
;
type_explicitly_set_p
=
da
->
debug_type
!=
NO_DEBUG
;
}
write_symbols
=
(
level
==
0
?
NO_DEBUG
:
selected_debug_type
);
use_gnu_debug_info_extensions
=
da
->
use_extensions_p
;
debug_info_level
=
(
enum
debug_info_level
)
level
;
}
break
;
}
}
/* If it is not an -f or -W option allow the match */
if
(
option
[
0
]
!=
'-'
)
return
1
;
if
(
!
da
->
arg
)
warning
(
"`%s' not supported by this configuration of GCC"
,
arg
-
2
);
return
1
;
}
/* Decode the first argument in the argv as a language-independent option.
Return the number of strings consumed. 'strings_processed' is the
number of strings that have already been decoded in a language
specific fashion before this function was invoked. */
static
unsigned
independent_decode_option
(
argc
,
argv
,
strings_processed
)
int
argc
;
char
**
argv
;
unsigned
strings_processed
ATTRIBUTE_UNUSED
;
{
char
*
arg
=
argv
[
0
];
switch
(
option
[
1
]
)
if
(
arg
[
0
]
!=
'-'
||
arg
[
1
]
==
0
)
{
case
'f'
:
indep_options
=
f_options
;
break
;
case
'W'
:
indep_options
=
W_options
;
break
;
default
:
return
1
;
if
(
arg
[
0
]
==
'+'
)
return
0
;
filename
=
arg
;
return
1
;
}
arg
++
;
/* The option is a -f or -W option.
Skip past the prefix and search for the remainder in the
appropriate table of options. */
option
+=
2
;
if
(
option
[
0
]
==
'n'
&&
option
[
1
]
==
'o'
&&
option
[
2
]
==
'-'
)
option
+=
3
;
if
(
!
strcmp
(
arg
,
"-help"
))
{
display_help
();
exit
(
0
);
}
if
(
*
arg
==
'Y'
)
arg
++
;
for
(
k
=
NUM_ELEM
(
indep_options
);
k
--
;
)
switch
(
*
arg
)
{
if
(
!
strcmp
(
option
,
indep_options
[
k
].
string
))
default
:
return
0
;
case
'O'
:
/* Already been treated in main (). Do nothing. */
break
;
case
'm'
:
set_target_switch
(
arg
+
1
);
break
;
case
'f'
:
return
decode_f_option
(
arg
+
1
);
case
'g'
:
return
decode_g_option
(
arg
+
1
);
case
'd'
:
if
(
!
strcmp
(
arg
,
"dumpbase"
))
{
if
(
argc
==
1
)
return
0
;
dump_base_name
=
argv
[
1
];
return
2
;
}
else
decode_d_option
(
arg
+
1
);
break
;
case
'p'
:
if
(
!
strcmp
(
arg
,
"pedantic"
))
pedantic
=
1
;
else
if
(
!
strcmp
(
arg
,
"pedantic-errors"
))
flag_pedantic_errors
=
pedantic
=
1
;
else
if
(
arg
[
1
]
==
0
)
profile_flag
=
1
;
else
return
0
;
break
;
case
'q'
:
if
(
!
strcmp
(
arg
,
"quiet"
))
quiet_flag
=
1
;
else
return
0
;
break
;
case
'v'
:
if
(
!
strcmp
(
arg
,
"version"
))
version_flag
=
1
;
else
return
0
;
break
;
case
'w'
:
if
(
arg
[
1
]
==
0
)
inhibit_warnings
=
1
;
else
return
0
;
break
;
case
'W'
:
if
(
arg
[
1
]
==
0
)
{
extra_warnings
=
1
;
/* We save the value of warn_uninitialized, since if they put
-Wuninitialized on the command line, we need to generate a
warning about not using it without also specifying -O. */
if
(
warn_uninitialized
!=
1
)
warn_uninitialized
=
2
;
}
else
return
decode_W_option
(
arg
+
1
);
break
;
case
'a'
:
if
(
arg
[
1
]
==
0
)
{
#if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
warning
(
"`-a' option (basic block profile) not supported"
);
#else
profile_block_flag
=
(
profile_block_flag
<
2
)
?
1
:
3
;
#endif
}
else
if
(
!
strcmp
(
arg
,
"ax"
))
{
#if !defined (FUNCTION_BLOCK_PROFILER_EXIT) || !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
warning
(
"`-ax' option (jump profiling) not supported"
);
#else
profile_block_flag
=
(
!
profile_block_flag
||
profile_block_flag
==
2
)
?
2
:
3
;
#endif
}
else
if
(
!
strncmp
(
arg
,
"aux-info"
,
8
))
{
flag_gen_aux_info
=
1
;
if
(
arg
[
8
]
==
'\0'
)
{
if
(
argc
==
1
)
return
0
;
aux_info_file_name
=
argv
[
1
];
return
2
;
}
else
aux_info_file_name
=
arg
+
8
;
}
else
return
0
;
break
;
case
'o'
:
if
(
arg
[
1
]
==
0
)
{
/* The option matched a language independent option,
do not allow the language specific match. */
if
(
argc
==
1
)
return
0
;
return
0
;
asm_file_name
=
argv
[
1
];
return
2
;
}
return
0
;
case
'G'
:
{
int
g_switch_val
;
int
return_val
;
if
(
arg
[
1
]
==
0
)
{
if
(
argc
==
1
)
return
0
;
g_switch_val
=
read_integral_parameter
(
argv
[
1
],
0
,
-
1
);
return_val
=
2
;
}
else
{
g_switch_val
=
read_integral_parameter
(
arg
+
1
,
0
,
-
1
);
return_val
=
1
;
}
if
(
g_switch_val
==
-
1
)
return_val
=
0
;
else
{
g_switch_set
=
TRUE
;
g_switch_value
=
g_switch_val
;
}
return
return_val
;
}
}
/* The option matches the start of the langauge specific option
and it is not an exact match for a language independent option. */
return
1
;
}
...
...
@@ -4719,9 +5193,6 @@ main (argc, argv)
char
**
argv
;
{
register
int
i
;
char
*
filename
=
0
;
int
flag_print_mem
=
0
;
int
version_flag
=
0
;
char
*
p
;
/* save in case md file wants to emit args as a comment. */
...
...
@@ -4872,480 +5343,30 @@ main (argc, argv)
/* Initialize register usage now so switches may override. */
init_reg_sets
();
for
(
i
=
1
;
i
<
argc
;
i
++
)
/* Perform normal command line switch decoding. */
for
(
i
=
1
;
i
<
argc
;)
{
size_t
j
;
unsigned
lang_processed
;
unsigned
indep_processed
;
/* If this is a language-specific option,
decode it in a language-specific way. */
for
(
j
=
NUM_ELEM
(
documented_lang_options
);
j
--
;)
if
(
check_lang_option
(
argv
[
i
],
documented_lang_options
[
j
].
option
))
break
;
if
(
j
!=
(
size_t
)
-
1
)
{
/* If the option is valid for *some* language,
treat it as valid even if this language doesn't understand it. */
int
strings_processed
=
lang_decode_option
(
argc
-
i
,
argv
+
i
);
if
(
!
strcmp
(
argv
[
i
],
"--help"
))
{
display_help
();
return
(
0
);
}
if
(
strings_processed
!=
0
)
i
+=
strings_processed
-
1
;
}
else
if
(
argv
[
i
][
0
]
==
'-'
&&
argv
[
i
][
1
]
!=
0
)
/* Give the language a chance to decode the option for itself. */
lang_processed
=
lang_decode_option
(
argc
-
i
,
argv
+
i
);
/* Now see if the option also has a language independent meaning.
Some options are both language specific and language independent,
eg --help. It is possible that there might be options that should
only be decoded in a language independent way if the were not
decoded in a langauge specific way, which is why 'lang_processed'
is passed in. */
indep_processed
=
independent_decode_option
(
argc
-
i
,
argv
+
i
,
lang_processed
);
if
(
lang_processed
||
indep_processed
)
i
+=
lang_processed
>
indep_processed
?
lang_processed
:
indep_processed
;
else
{
register
char
*
str
=
argv
[
i
]
+
1
;
if
(
str
[
0
]
==
'Y'
)
str
++
;
if
(
str
[
0
]
==
'm'
)
set_target_switch
(
&
str
[
1
]);
else
if
(
!
strcmp
(
str
,
"dumpbase"
))
{
dump_base_name
=
argv
[
++
i
];
}
else
if
(
str
[
0
]
==
'd'
)
{
register
char
*
p
=
&
str
[
1
];
while
(
*
p
)
switch
(
*
p
++
)
{
case
'a'
:
branch_prob_dump
=
1
;
combine_dump
=
1
;
#ifdef DELAY_SLOTS
dbr_sched_dump
=
1
;
#endif
flow_dump
=
1
;
flow2_dump
=
1
;
global_reg_dump
=
1
;
jump_opt_dump
=
1
;
addressof_dump
=
1
;
jump2_opt_dump
=
1
;
local_reg_dump
=
1
;
loop_dump
=
1
;
regmove_dump
=
1
;
rtl_dump
=
1
;
cse_dump
=
1
,
cse2_dump
=
1
;
gcse_dump
=
1
;
sched_dump
=
1
;
sched2_dump
=
1
;
#ifdef STACK_REGS
stack_reg_dump
=
1
;
#endif
#ifdef MACHINE_DEPENDENT_REORG
mach_dep_reorg_dump
=
1
;
#endif
peephole2_dump
=
1
;
break
;
case
'A'
:
flag_debug_asm
=
1
;
break
;
case
'b'
:
branch_prob_dump
=
1
;
break
;
case
'c'
:
combine_dump
=
1
;
break
;
#ifdef DELAY_SLOTS
case
'd'
:
dbr_sched_dump
=
1
;
break
;
#endif
case
'f'
:
flow_dump
=
1
;
break
;
case
'F'
:
addressof_dump
=
1
;
break
;
case
'g'
:
global_reg_dump
=
1
;
break
;
case
'G'
:
gcse_dump
=
1
;
break
;
case
'j'
:
jump_opt_dump
=
1
;
break
;
case
'J'
:
jump2_opt_dump
=
1
;
break
;
#ifdef STACK_REGS
case
'k'
:
stack_reg_dump
=
1
;
break
;
#endif
case
'l'
:
local_reg_dump
=
1
;
break
;
case
'L'
:
loop_dump
=
1
;
break
;
case
'm'
:
flag_print_mem
=
1
;
break
;
#ifdef MACHINE_DEPENDENT_REORG
case
'M'
:
mach_dep_reorg_dump
=
1
;
break
;
#endif
case
'p'
:
flag_print_asm_name
=
1
;
break
;
case
'r'
:
rtl_dump
=
1
;
break
;
case
'R'
:
sched2_dump
=
1
;
break
;
case
's'
:
cse_dump
=
1
;
break
;
case
'S'
:
sched_dump
=
1
;
break
;
case
't'
:
cse2_dump
=
1
;
break
;
case
'N'
:
regmove_dump
=
1
;
break
;
case
'v'
:
graph_dump_format
=
vcg
;
break
;
case
'w'
:
flow2_dump
=
1
;
break
;
case
'x'
:
rtl_dump_and_exit
=
1
;
break
;
case
'y'
:
set_yydebug
(
1
);
break
;
case
'z'
:
peephole2_dump
=
1
;
break
;
case
'D'
:
/* these are handled by the preprocessor */
case
'I'
:
break
;
default:
warning
(
"unrecognised gcc debugging option: %c"
,
p
[
-
1
]);
break
;
}
}
else
if
(
str
[
0
]
==
'f'
)
{
register
char
*
p
=
&
str
[
1
];
int
found
=
0
;
/* Some kind of -f option.
P's value is the option sans `-f'.
Search for it in the table of options. */
for
(
j
=
0
;
!
found
&&
j
<
sizeof
(
f_options
)
/
sizeof
(
f_options
[
0
]);
j
++
)
{
if
(
!
strcmp
(
p
,
f_options
[
j
].
string
))
{
*
f_options
[
j
].
variable
=
f_options
[
j
].
on_value
;
/* A goto here would be cleaner,
but breaks the vax pcc. */
found
=
1
;
}
if
(
p
[
0
]
==
'n'
&&
p
[
1
]
==
'o'
&&
p
[
2
]
==
'-'
&&
!
strcmp
(
p
+
3
,
f_options
[
j
].
string
))
{
*
f_options
[
j
].
variable
=
!
f_options
[
j
].
on_value
;
found
=
1
;
}
}
if
(
found
)
;
else
if
(
!
strncmp
(
p
,
"inline-limit-"
,
13
)
||
!
strncmp
(
p
,
"inline-limit="
,
13
))
inline_max_insns
=
read_integral_parameter
(
p
+
13
,
p
-
2
,
inline_max_insns
);
#ifdef INSN_SCHEDULING
else
if
(
!
strncmp
(
p
,
"sched-verbose="
,
14
))
fix_sched_param
(
"verbose"
,
&
p
[
14
]);
#endif
else
if
(
!
strncmp
(
p
,
"fixed-"
,
6
))
fix_register
(
&
p
[
6
],
1
,
1
);
else
if
(
!
strncmp
(
p
,
"call-used-"
,
10
))
fix_register
(
&
p
[
10
],
0
,
1
);
else
if
(
!
strncmp
(
p
,
"call-saved-"
,
11
))
fix_register
(
&
p
[
11
],
0
,
0
);
else
if
(
!
strncmp
(
p
,
"align-loops="
,
12
))
align_loops
=
read_integral_parameter
(
p
+
12
,
p
-
2
,
align_loops
);
else
if
(
!
strncmp
(
p
,
"align-functions="
,
16
))
align_functions
=
read_integral_parameter
(
p
+
16
,
p
-
2
,
align_functions
);
else
if
(
!
strncmp
(
p
,
"align-jumps="
,
12
))
align_jumps
=
read_integral_parameter
(
p
+
12
,
p
-
2
,
align_jumps
);
else
if
(
!
strncmp
(
p
,
"align-labels="
,
13
))
align_labels
=
read_integral_parameter
(
p
+
13
,
p
-
2
,
align_labels
);
else
error
(
"Invalid option `%s'"
,
argv
[
i
]);
}
else
if
(
str
[
0
]
==
'O'
)
{
/* Already been treated above. Do nothing. */
}
else
if
(
!
strcmp
(
str
,
"pedantic"
))
pedantic
=
1
;
else
if
(
!
strcmp
(
str
,
"pedantic-errors"
))
flag_pedantic_errors
=
pedantic
=
1
;
else
if
(
!
strcmp
(
str
,
"quiet"
))
quiet_flag
=
1
;
else
if
(
!
strcmp
(
str
,
"version"
))
version_flag
=
1
;
else
if
(
!
strcmp
(
str
,
"w"
))
inhibit_warnings
=
1
;
else
if
(
!
strcmp
(
str
,
"W"
))
{
extra_warnings
=
1
;
/* We save the value of warn_uninitialized, since if they put
-Wuninitialized on the command line, we need to generate a
warning about not using it without also specifying -O. */
if
(
warn_uninitialized
!=
1
)
warn_uninitialized
=
2
;
}
else
if
(
str
[
0
]
==
'W'
)
{
register
char
*
p
=
&
str
[
1
];
int
found
=
0
;
/* Some kind of -W option.
P's value is the option sans `-W'.
Search for it in the table of options. */
for
(
j
=
0
;
!
found
&&
j
<
sizeof
(
W_options
)
/
sizeof
(
W_options
[
0
]);
j
++
)
{
if
(
!
strcmp
(
p
,
W_options
[
j
].
string
))
{
*
W_options
[
j
].
variable
=
W_options
[
j
].
on_value
;
/* A goto here would be cleaner,
but breaks the vax pcc. */
found
=
1
;
}
if
(
p
[
0
]
==
'n'
&&
p
[
1
]
==
'o'
&&
p
[
2
]
==
'-'
&&
!
strcmp
(
p
+
3
,
W_options
[
j
].
string
))
{
*
W_options
[
j
].
variable
=
!
W_options
[
j
].
on_value
;
found
=
1
;
}
}
if
(
found
)
;
else
if
(
!
strncmp
(
p
,
"id-clash-"
,
9
))
{
const
int
id_clash_val
=
read_integral_parameter
(
p
+
9
,
p
-
2
,
-
1
);
if
(
id_clash_val
!=
-
1
)
{
id_clash_len
=
id_clash_val
;
warn_id_clash
=
1
;
}
}
else
if
(
!
strncmp
(
p
,
"larger-than-"
,
12
))
{
const
int
larger_than_val
=
read_integral_parameter
(
p
+
12
,
p
-
2
,
-
1
);
if
(
larger_than_val
!=
-
1
)
{
larger_than_size
=
larger_than_val
;
warn_larger_than
=
1
;
}
}
else
error
(
"Invalid option `%s'"
,
argv
[
i
]);
}
else
if
(
!
strcmp
(
str
,
"p"
))
{
profile_flag
=
1
;
}
else
if
(
!
strcmp
(
str
,
"a"
))
{
#if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
warning
(
"`-a' option (basic block profile) not supported"
);
#else
profile_block_flag
=
(
profile_block_flag
<
2
)
?
1
:
3
;
#endif
}
else
if
(
!
strcmp
(
str
,
"ax"
))
{
#if !defined (FUNCTION_BLOCK_PROFILER_EXIT) || !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
warning
(
"`-ax' option (jump profiling) not supported"
);
#else
profile_block_flag
=
(
!
profile_block_flag
||
profile_block_flag
==
2
)
?
2
:
3
;
#endif
}
else
if
(
str
[
0
]
==
'g'
)
{
unsigned
level
;
/* A lot of code assumes write_symbols == NO_DEBUG if the
debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
of what debugging type has been selected). This records the
selected type. It is an error to specify more than one
debugging type. */
static
enum
debug_info_type
selected_debug_type
=
NO_DEBUG
;
/* Non-zero if debugging format has been explicitly set.
-g and -ggdb don't explicitly set the debugging format so
-gdwarf -g3 is equivalent to -gdwarf3. */
static
int
type_explicitly_set_p
=
0
;
/* Indexed by enum debug_info_type. */
static
const
char
*
debug_type_names
[]
=
{
"none"
,
"stabs"
,
"coff"
,
"dwarf-1"
,
"dwarf-2"
,
"xcoff"
};
/* The maximum admissible debug level value. */
static
const
unsigned
max_debug_level
=
3
;
/* Look up STR in the table. */
for
(
da
=
debug_args
;
da
->
arg
;
da
++
)
{
const
int
da_len
=
strlen
(
da
->
arg
);
if
(
!
strncmp
(
str
,
da
->
arg
,
da_len
))
{
enum
debug_info_type
type
=
da
->
debug_type
;
const
char
*
p
=
str
+
da_len
;
if
(
*
p
&&
(
*
p
<
'0'
||
*
p
>
'9'
))
continue
;
/* A debug flag without a level defaults to level 2.
Note we do not want to call read_integral_parameter
for that case since it will call atoi which
will return zero.
??? We may want to generalize the interface to
read_integral_parameter to better handle this case
if this case shows up often. */
if
(
*
p
)
level
=
read_integral_parameter
(
p
,
0
,
max_debug_level
+
1
);
else
level
=
2
;
if
(
da_len
>
1
&&
*
p
&&
!
strncmp
(
str
,
"gdwarf"
,
da_len
))
{
error
(
"use -gdwarf -g%d for DWARF v1, level %d"
,
level
,
level
);
if
(
level
==
2
)
error
(
"use -gdwarf-2 for DWARF v2"
);
}
if
(
level
>
max_debug_level
)
{
warning
(
"ignoring option `%s' due to invalid debug level specification"
,
str
-
1
);
level
=
debug_info_level
;
}
if
(
type
==
NO_DEBUG
)
{
type
=
PREFERRED_DEBUGGING_TYPE
;
if
(
da_len
>
1
&&
strncmp
(
str
,
"ggdb"
,
da_len
)
==
0
)
{
#if defined (DWARF2_DEBUGGING_INFO) && !defined (LINKER_DOES_NOT_WORK_WITH_DWARF2)
type
=
DWARF2_DEBUG
;
#else
#ifdef DBX_DEBUGGING_INFO
type
=
DBX_DEBUG
;
#endif
#endif
}
}
if
(
type
==
NO_DEBUG
)
warning
(
"`-%s' not supported by this configuration of GCC"
,
str
);
/* Does it conflict with an already selected type? */
if
(
type_explicitly_set_p
/* -g/-ggdb don't conflict with anything */
&&
da
->
debug_type
!=
NO_DEBUG
&&
type
!=
selected_debug_type
)
warning
(
"`-%s' ignored, conflicts with `-g%s'"
,
str
,
debug_type_names
[(
int
)
selected_debug_type
]);
else
{
/* If the format has already been set, -g/-ggdb
only change the debug level. */
if
(
type_explicitly_set_p
&&
da
->
debug_type
==
NO_DEBUG
)
;
/* don't change debugging type */
else
{
selected_debug_type
=
type
;
type_explicitly_set_p
=
da
->
debug_type
!=
NO_DEBUG
;
}
write_symbols
=
(
level
==
0
?
NO_DEBUG
:
selected_debug_type
);
use_gnu_debug_info_extensions
=
da
->
use_extensions_p
;
debug_info_level
=
(
enum
debug_info_level
)
level
;
}
break
;
}
}
if
(
!
da
->
arg
)
warning
(
"`-%s' not supported by this configuration of GCC"
,
str
);
}
else
if
(
!
strcmp
(
str
,
"o"
))
{
asm_file_name
=
argv
[
++
i
];
}
else
if
(
str
[
0
]
==
'G'
)
{
const
int
g_switch_val
=
(
str
[
1
]
!=
'\0'
)
?
read_integral_parameter
(
str
+
1
,
0
,
-
1
)
:
read_integral_parameter
(
argv
[
++
i
],
0
,
-
1
);
if
(
g_switch_val
!=
-
1
)
{
g_switch_set
=
TRUE
;
g_switch_value
=
g_switch_val
;
}
else
{
error
(
"Invalid option `-%s'"
,
str
);
}
}
else
if
(
!
strncmp
(
str
,
"aux-info"
,
8
))
{
flag_gen_aux_info
=
1
;
aux_info_file_name
=
(
str
[
8
]
!=
'\0'
?
str
+
8
:
argv
[
++
i
]);
}
else
if
(
!
strcmp
(
str
,
"-help"
))
{
display_help
();
return
(
0
);
}
else
error
(
"Invalid option `%s'"
,
argv
[
i
]);
error
(
"Invalid option `%s'"
,
argv
[
i
]);
i
++
;
}
else
if
(
argv
[
i
][
0
]
==
'+'
)
error
(
"Invalid option `%s'"
,
argv
[
i
]);
else
filename
=
argv
[
i
];
}
/* Checker uses the frame pointer. */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment