From 040968a88a1e9a8e4dd5f760e3fb4cabe5a63979 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 28 Jan 2015 20:57:35 +0100 Subject: [PATCH] * lto-symtab.c (lto_varpool_replace_node): Merge TLS models. From-SVN: r220214 --- gcc/lto/ChangeLog | 4 ++++ gcc/lto/lto-symtab.c | 43 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index f247f4193c7..98f256a035c 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2014-12-11 Jan Hubicka + + * lto-symtab.c (lto_varpool_replace_node): Merge TLS models. + 2014-12-11 Jan Hubicka * lto.c (compare_tree_sccs_1): Add comparsion of diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index e3cc1902e03..98edb883440 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -158,11 +158,44 @@ lto_varpool_replace_node (varpool_node *vnode, if (vnode->tls_model != prevailing_node->tls_model) { - error_at (DECL_SOURCE_LOCATION (vnode->decl), - "%qD is defined as %s", vnode->decl, tls_model_names [vnode->tls_model]); - inform (DECL_SOURCE_LOCATION (prevailing_node->decl), - "previously defined here as %s", - tls_model_names [prevailing_node->tls_model]); + bool error = false; + + /* Non-TLS and TLS never mix together. Also emulated model is not + compatible with anything else. */ + if (prevailing_node->tls_model == TLS_MODEL_NONE + || prevailing_node->tls_model == TLS_MODEL_EMULATED + || vnode->tls_model == TLS_MODEL_NONE + || vnode->tls_model == TLS_MODEL_EMULATED) + error = true; + /* Linked is silently supporting transitions + GD -> IE, GD -> LE, LD -> LE, IE -> LE, LD -> IE. + Do the same transitions and error out on others. */ + else if ((prevailing_node->tls_model == TLS_MODEL_REAL + || prevailing_node->tls_model == TLS_MODEL_LOCAL_DYNAMIC) + && (vnode->tls_model == TLS_MODEL_INITIAL_EXEC + || vnode->tls_model == TLS_MODEL_LOCAL_EXEC)) + prevailing_node->tls_model = vnode->tls_model; + else if ((vnode->tls_model == TLS_MODEL_REAL + || vnode->tls_model == TLS_MODEL_LOCAL_DYNAMIC) + && (prevailing_node->tls_model == TLS_MODEL_INITIAL_EXEC + || prevailing_node->tls_model == TLS_MODEL_LOCAL_EXEC)) + ; + else if (prevailing_node->tls_model == TLS_MODEL_INITIAL_EXEC + && vnode->tls_model == TLS_MODEL_LOCAL_EXEC) + prevailing_node->tls_model = vnode->tls_model; + else if (vnode->tls_model == TLS_MODEL_INITIAL_EXEC + && prevailing_node->tls_model == TLS_MODEL_LOCAL_EXEC) + ; + else + error = true; + if (error) + { + error_at (DECL_SOURCE_LOCATION (vnode->decl), + "%qD is defined with tls model %s", vnode->decl, tls_model_names [vnode->tls_model]); + inform (DECL_SOURCE_LOCATION (prevailing_node->decl), + "previously defined here as %s", + tls_model_names [prevailing_node->tls_model]); + } } /* Finally remove the replaced node. */ vnode->remove (); -- 2.30.2