Use proper location for tls_init function (PR c++/88263).
2018-12-27 Martin Liska <mliska@suse.cz> PR c++/88263 * decl2.c (get_local_tls_init_fn): Add location_t argument and use it. (get_tls_init_fn): Call it with location of variable for which we'll need to create tls_init function. (handle_tls_init): Likewise. 2018-12-27 Martin Liska <mliska@suse.cz> PR c++/88263 * g++.dg/gcov/pr88263.C: New test. From-SVN: r267429
This commit is contained in:
parent
75e479a8b5
commit
44787584de
4 changed files with 50 additions and 6 deletions
|
@ -1,3 +1,12 @@
|
|||
2018-12-27 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR c++/88263
|
||||
* decl2.c (get_local_tls_init_fn): Add location_t argument and
|
||||
use it.
|
||||
(get_tls_init_fn): Call it with location of variable for which
|
||||
we'll need to create tls_init function.
|
||||
(handle_tls_init): Likewise.
|
||||
|
||||
2018-12-21 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/86524
|
||||
|
|
|
@ -3331,15 +3331,15 @@ var_needs_tls_wrapper (tree var)
|
|||
translation unit. */
|
||||
|
||||
static tree
|
||||
get_local_tls_init_fn (void)
|
||||
get_local_tls_init_fn (location_t loc)
|
||||
{
|
||||
tree sname = get_identifier ("__tls_init");
|
||||
tree fn = get_global_binding (sname);
|
||||
if (!fn)
|
||||
{
|
||||
fn = build_lang_decl (FUNCTION_DECL, sname,
|
||||
build_function_type (void_type_node,
|
||||
void_list_node));
|
||||
fn = build_lang_decl_loc (loc, FUNCTION_DECL, sname,
|
||||
build_function_type (void_type_node,
|
||||
void_list_node));
|
||||
SET_DECL_LANGUAGE (fn, lang_c);
|
||||
TREE_PUBLIC (fn) = false;
|
||||
DECL_ARTIFICIAL (fn) = true;
|
||||
|
@ -3369,7 +3369,7 @@ get_tls_init_fn (tree var)
|
|||
/* If the variable is internal, or if we can't generate aliases,
|
||||
call the local init function directly. */
|
||||
if (!TREE_PUBLIC (var) || !TARGET_SUPPORTS_ALIASES)
|
||||
return get_local_tls_init_fn ();
|
||||
return get_local_tls_init_fn (DECL_SOURCE_LOCATION (var));
|
||||
|
||||
tree sname = mangle_tls_init_fn (var);
|
||||
tree fn = get_global_binding (sname);
|
||||
|
@ -4435,7 +4435,7 @@ handle_tls_init (void)
|
|||
set_decl_tls_model (guard, decl_default_tls_model (guard));
|
||||
pushdecl_top_level_and_finish (guard, NULL_TREE);
|
||||
|
||||
tree fn = get_local_tls_init_fn ();
|
||||
tree fn = get_local_tls_init_fn (loc);
|
||||
start_preparsed_function (fn, NULL_TREE, SF_PRE_PARSED);
|
||||
tree body = begin_function_body ();
|
||||
tree if_stmt = begin_if_stmt ();
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2018-12-27 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR c++/88263
|
||||
* g++.dg/gcov/pr88263.C: New test.
|
||||
|
||||
2018-12-26 Steven G. Kargl <kargl@gcc.gnu.org>
|
||||
|
||||
PR fortran/85357
|
||||
|
|
30
gcc/testsuite/g++.dg/gcov/pr88263.C
Normal file
30
gcc/testsuite/g++.dg/gcov/pr88263.C
Normal file
|
@ -0,0 +1,30 @@
|
|||
// PR gcov-profile/88263
|
||||
// { dg-options "-fprofile-arcs -ftest-coverage -std=c++11" }
|
||||
// { dg-do run { target native } }
|
||||
|
||||
#include <sstream>
|
||||
|
||||
namespace log {
|
||||
|
||||
class Logstream {
|
||||
public:
|
||||
|
||||
private:
|
||||
/// The logging stream
|
||||
static thread_local std::ostringstream os_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace log {
|
||||
|
||||
thread_local std::ostringstream Logstream::os_;
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// { dg-final { run-gcov pr88263.C } }
|
Loading…
Add table
Reference in a new issue