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
155732f5
Commit
155732f5
authored
May 29, 2011
by
Janne Blomqvist
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PR 48931 Use async-signal-safe execve instead of execvp
From-SVN: r174415
parent
eb93b31f
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
75 additions
and
2 deletions
+75
-2
libgfortran/ChangeLog
+12
-0
libgfortran/libgfortran.h
+3
-0
libgfortran/runtime/backtrace.c
+10
-2
libgfortran/runtime/compile_options.c
+11
-0
libgfortran/runtime/main.c
+39
-0
No files found.
libgfortran/ChangeLog
View file @
155732f5
2011-05-29 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/48931
* libgfortran.h (find_addr2line): New prototype.
* runtime/backtrace.c (show_backtrace): Use async-signal-safe
execve and stored path of addr2line.
* runtime/compile_options.c (maybe_find_addr2line): New function.
(set_options): Call maybe_find_addr2line if backtracing is enabled.
* runtime/main.c (find_addr2line): New function.
(init): Call find_addr2line if backtracing is enabled.
(cleanup): Free addr2line_path.
2011-05-29 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/49214
* runtime/backtrace.c (fd_gets): Return NULL if nothing was read.
...
...
libgfortran/libgfortran.h
View file @
155732f5
...
...
@@ -665,6 +665,9 @@ export_proto(store_exe_path);
extern
char
*
full_exe_path
(
void
);
internal_proto
(
full_exe_path
);
extern
void
find_addr2line
(
void
);
internal_proto
(
find_addr2line
);
/* backtrace.c */
extern
void
show_backtrace
(
void
);
...
...
libgfortran/runtime/backtrace.c
View file @
155732f5
...
...
@@ -104,6 +104,9 @@ fd_gets (char *s, int size, int fd)
}
extern
char
*
addr2line_path
;
/* show_backtrace displays the backtrace, currently obtained by means of
the glibc backtrace* functions. */
...
...
@@ -124,6 +127,9 @@ show_backtrace (void)
#if CAN_PIPE
if
(
addr2line_path
==
NULL
)
goto
fallback_noerr
;
/* We attempt to extract file and line information from addr2line. */
do
{
...
...
@@ -146,6 +152,7 @@ show_backtrace (void)
/* Child process. */
#define NUM_FIXEDARGS 7
char
*
arg
[
NUM_FIXEDARGS
];
char
*
newenv
[]
=
{
NULL
};
close
(
f
[
0
]);
...
...
@@ -160,14 +167,14 @@ show_backtrace (void)
_exit
(
1
);
close
(
f
[
1
]);
arg
[
0
]
=
(
char
*
)
"addr2line"
;
arg
[
0
]
=
addr2line_path
;
arg
[
1
]
=
(
char
*
)
"-e"
;
arg
[
2
]
=
full_exe_path
();
arg
[
3
]
=
(
char
*
)
"-f"
;
arg
[
4
]
=
(
char
*
)
"-s"
;
arg
[
5
]
=
(
char
*
)
"-C"
;
arg
[
6
]
=
NULL
;
execv
p
(
arg
[
0
],
arg
);
execv
e
(
addr2line_path
,
arg
,
newenv
);
_exit
(
1
);
#undef NUM_FIXEDARGS
}
...
...
@@ -264,6 +271,7 @@ fallback:
#endif
/* CAN_PIPE */
fallback_noerr:
/* Fallback to the glibc backtrace. */
estr_write
(
"
\n
Backtrace for this error:
\n
"
);
backtrace_symbols_fd
(
trace
,
depth
,
STDERR_FILENO
);
...
...
libgfortran/runtime/compile_options.c
View file @
155732f5
...
...
@@ -58,6 +58,15 @@ backtrace_handler (int signum)
}
/* Helper function for set_options because we need to access the
global variable options which is not seen in set_options. */
static
void
maybe_find_addr2line
(
void
)
{
if
(
options
.
backtrace
==
-
1
)
find_addr2line
();
}
/* Set the usual compile-time options. */
extern
void
set_options
(
int
,
int
[]);
export_proto
(
set_options
);
...
...
@@ -131,6 +140,8 @@ set_options (int num, int options[])
#if defined(SIGXFSZ)
signal
(
SIGXFSZ
,
backtrace_handler
);
#endif
maybe_find_addr2line
();
}
#endif
...
...
libgfortran/runtime/main.c
View file @
155732f5
...
...
@@ -139,6 +139,40 @@ full_exe_path (void)
}
char
*
addr2line_path
;
/* Find addr2line and store the path. */
void
find_addr2line
(
void
)
{
#ifdef HAVE_ACCESS
#define A2L_LEN 10
char
*
path
=
getenv
(
"PATH"
);
size_t
n
=
strlen
(
path
);
char
ap
[
n
+
1
+
A2L_LEN
];
size_t
ai
=
0
;
for
(
size_t
i
=
0
;
i
<
n
;
i
++
)
{
if
(
path
[
i
]
!=
':'
)
ap
[
ai
++
]
=
path
[
i
];
else
{
ap
[
ai
++
]
=
'/'
;
memcpy
(
ap
+
ai
,
"addr2line"
,
A2L_LEN
);
if
(
access
(
ap
,
R_OK
|
X_OK
)
==
0
)
{
addr2line_path
=
strdup
(
ap
);
return
;
}
else
ai
=
0
;
}
}
#endif
}
/* Set the saved values of the command line arguments. */
void
...
...
@@ -185,6 +219,9 @@ init (void)
/* if (argc > 1 && strcmp(argv[1], "--resume") == 0) resume(); */
#endif
if
(
options
.
backtrace
==
1
)
find_addr2line
();
random_seed_i4
(
NULL
,
NULL
,
NULL
);
}
...
...
@@ -198,4 +235,6 @@ cleanup (void)
if
(
please_free_exe_path_when_done
)
free
((
char
*
)
exe_path
);
free
(
addr2line_path
);
}
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