From: Tom Kacvinsky <tkacvins@gmail.com>
To: Jonathan Wakely <jwakely.gcc@gmail.com>
Cc: gcc-help <gcc-help@gcc.gnu.org>
Subject: Re: GCC 8.3.0, -flto and violation of C++ One Definition Rule
Date: Wed, 29 Dec 2021 11:15:51 -0500 [thread overview]
Message-ID: <CAG_eJLcFe46N16CVGO4jnhbP0oazo015oDtvOOXgNrOWs7QbdA@mail.gmail.com> (raw)
In-Reply-To: <CAH6eHdTc9hafc5+3YZz4Y9N3MF-cvov7_jRYpm0ki70crBm2ZA@mail.gmail.com>
On Wed, Dec 29, 2021 at 10:39 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote:
>
>
>
> On Wed, 29 Dec 2021, 11:45 Tom Kacvinsky via Gcc-help, <gcc-help@gcc.gnu.org> wrote:
>>
>> Hi,
>>
>> First, using GCC 8.3.0 and binutils 2.37.I am trying to increase
>> performance of linking our product, so I thought I'd give LTO a try. So
>> I am compiling all object files with -flto, and passing -flto to g++
>> (which we use as our link driver). However, what I have found is that
>> some of our code violates the C++ One Definition Rule (-Werror=odr). This
>> only happens when building with LTO - without LTO, the C++ rule is
>> not violated.
>
>
> As already explained, this is almost certainly wrong. It is more likely that the LTO violation is always present, but only detected when using LTO.
>
>
>> The problem exists with LTO using both the BFD and gold
>> linkers.
>>
>> So, my question is, since the LTO object files are now such that one
>> needs to use gcc-nm to examine them (which I know is a wrapper around nm,
>> and passes an option to load the LTO plugin). how can I leverage that to
>> see if there are other translation units that define the class that ODR
>> violation is complaining about? I did do a fairly thorough analysis of
>> the object files and did not see there the particular class and methods
>> would be multiply defined,
>
>
> It would help if you tell us the actual error/warning you get. -Wodr can warn about various different things. It does not warn about multiple definitions, it warns about *inconsistent* definitions.
>
This is long. Not sure of the attachment fule for this, so I am
pasting it in email. Ib obfuscated the actual source file
names, but this is the general gist of the link error. I wonder if
the error is coming from boost::python::api::object.
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: error: type
‘struct Bar’ violates the C++ One Definition Rule [-Werror=odr]
class Bar {
^
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: a
different type is defined in another translation unit
class Bar {
^
/home/home/tkacvins/project/libbar/include/Bar.h:40:32: note: the
first difference of corresponding definitions is field ‘api’
boost::python::object* api;
^
/home/home/tkacvins/project/libbar/include/Bar.h:40:32: note: a field
of same name but different type is defined in another translation unit
boost::python::object* api;
^
/home/home/tkacvins/project/libbar/include/Bar.h:15:11: note: type
name ‘boost::python::object’ should match type name
‘boost::python::api::object’
class object;
^
/home/BUILD64/lib/boost-1.69.0-py39-1/include/boost/python/object_core.hpp:238:9:
note: the incompatible type is defined here
class object : public object_base
^
/home/tkacvins/libfoo/include/foo.h:21:8: error: type ‘struct
C_Function_Table’ violates the C++ One Definition Rule [-Werror=odr]
struct C_Function_Table
^
/home/tkacvins/project/libfoo/include/gen_foo.h:14: note: a different
type is defined in another translation unit
struct C_Function_Table
/home/tkacvins/libfoo/include/foo.h:25:52: note: the first difference
of corresponding definitions is field ‘create_quick_script_for_c’
int is_whitebox);
^
/home/tkacvins/project/libfoo/include/gen_foo.h:16: note: a field with
different name is defined in another translation unit
void (*create_quick_script_for_ada)(const char* param0, const char*
param1, const char* param2, int param3);
/home/home/tkacvins/project/libbar/include/Bar.h:82: error:
‘a2e_guard’ violates the C++ One Definition Rule [-Werror=odr]
void a2e_guard(bool enabled);
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:333: note: implicit
this pointer type mismatch
void Bar::a2e_guard(bool enabled){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:333: note:
‘a2e_guard’ was previously declared here
void Bar::a2e_guard(bool enabled){
/home/home/tkacvins/project/libbar/include/Bar.h:73:36: error:
‘instance’ violates the C++ One Definition Rule [-Werror=odr]
static Bar * instance();
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:329: note: return
value type mismatch
Bar * Bar::instance(){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:329: note:
‘instance’ was previously declared here
Bar * Bar::instance(){
/home/home/tkacvins/project/libbar/include/Bar.h:172:21: error:
‘get_source_file_name’ violates the C++ One Definition Rule
[-Werror=odr]
std::string get_source_file_name(int source_file_index);
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:1901: note:
implicit this pointer type mismatch
std::string Bar::get_source_file_name(int source_file_index){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:1901: note:
‘get_source_file_name’ was previously declared here
std::string Bar::get_source_file_name(int source_file_index){
/home/home/tkacvins/project/libbar/include/Bar.h:79:14: error:
‘get_enable_commits’ violates the C++ One Definition Rule
[-Werror=odr]
bool get_enable_commits();
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:447: note: implicit
this pointer type mismatch
bool Bar::get_enable_commits(){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:447: note:
‘get_enable_commits’ was previously declared here
bool Bar::get_enable_commits(){
/home/home/tkacvins/project/libbar/include/Bar.h:78:14: error:
‘set_enable_commits’ violates the C++ One Definition Rule
[-Werror=odr]
void set_enable_commits(bool enabled);
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:443: note: implicit
this pointer type mismatch
void Bar::set_enable_commits(bool enabled){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:443: note:
‘set_enable_commits’ was previously declared here
void Bar::set_enable_commits(bool enabled){
/home/home/tkacvins/project/libbar/include/Bar.h:77:14: error:
‘commit’ violates the C++ One Definition Rule [-Werror=odr]
void commit();
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:432: note: implicit
this pointer type mismatch
void Bar::commit(){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:432: note: ‘commit’
was previously declared here
void Bar::commit(){
/home/home/tkacvins/project/libbar/include/Bar.h:92:14: error:
‘ada_clean_slots’ violates the C++ One Definition Rule [-Werror=odr]
void ada_clean_slots (int parent_id, int max_index);
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:963: note: implicit
this pointer type mismatch
void Bar::ada_clean_slots(int parent_id, int max_index){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:963: note:
‘ada_clean_slots’ was previously declared here
void Bar::ada_clean_slots(int parent_id, int max_index){
/home/home/tkacvins/project/libbar/include/Bar.h:91:14: error:
‘ada_add_slot’ violates the C++ One Definition Rule [-Werror=odr]
void ada_add_slot (int parent_id, int
testcase_id, int index, int iterations, const char* delay, int print);
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:951: note: implicit
this pointer type mismatch
void Bar::ada_add_slot(int parent_id, int testcase_id, int index, int
iterations, const char * delay, int print) {
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:951: note:
‘ada_add_slot’ was previously declared here
void Bar::ada_add_slot(int parent_id, int testcase_id, int index, int
iterations, const char * delay, int print) {
/home/home/tkacvins/project/libbar/include/Bar.h:90:14: error:
‘delete_testcase_results’ violates the C++ One Definition Rule
[-Werror=odr]
void delete_testcase_results (int unique_id );
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:486: note: implicit
this pointer type mismatch
void Bar::delete_testcase_results(int unique_id){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:486: note:
‘delete_testcase_results’ was previously declared here
void Bar::delete_testcase_results(int unique_id){
/home/home/tkacvins/project/libbar/include/Bar.h:89:14: error:
‘delete_testcase’ violates the C++ One Definition Rule [-Werror=odr]
void delete_testcase (int unique_id );
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:477: note: implicit
this pointer type mismatch
void Bar::delete_testcase(int unique_id){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:477: note:
‘delete_testcase’ was previously declared here
void Bar::delete_testcase(int unique_id){
/home/home/tkacvins/project/libbar/include/Bar.h:88:14: error:
‘replace_testcase’ violates the C++ One Definition Rule [-Werror=odr]
void replace_testcase (int uut_id, int
subprogram_id, int testcase_index);
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:676: note: implicit
this pointer type mismatch
void Bar::replace_testcase(int uutID, int subprogID, int tcID){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:676: note:
‘replace_testcase’ was previously declared here
void Bar::replace_testcase(int uutID, int subprogID, int tcID){
/home/home/tkacvins/project/libbar/include/Bar.h:58:9: error:
‘__dt_comp ’ violates the C++ One Definition Rule [-Werror=odr]
~Bar();
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:295: note: implicit
this pointer type mismatch
Bar::~Bar() {
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:295: note:
‘__dt_comp ’ was previously declared here
Bar::~Bar() {
/home/home/tkacvins/project/libbar/include/Bar.h:80:14: error: ‘flush’
violates the C++ One Definition Rule [-Werror=odr]
void flush();
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:421: note: implicit
this pointer type mismatch
void Bar::flush(){
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:421: note: ‘flush’
was previously declared here
void Bar::flush(){
/home/home/tkacvins/project/libbar/include/Bar.h:57:9: error:
‘__ct_comp ’ violates the C++ One Definition Rule [-Werror=odr]
Bar(const char* path, bool force_create=false);
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:231: note: implicit
this pointer type mismatch
Bar::Bar(const char* path, bool force_create) {
/home/home/tkacvins/project/libbar/include/Bar.h:38:7: note: type
‘struct Bar’ itself violates the C++ One Definition Rule
class Bar {
^
/home/home/tkacvins/project/libbar/src/src/Bar.cpp:231: note:
‘__ct_comp ’ was previously declared here
Bar::Bar(const char* path, bool force_create) {
next prev parent reply other threads:[~2021-12-29 16:16 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-29 11:44 Tom Kacvinsky
2021-12-29 12:55 ` Xi Ruoyao
2021-12-29 13:34 ` Tom Kacvinsky
2021-12-29 15:38 ` Jonathan Wakely
2021-12-29 16:15 ` Tom Kacvinsky [this message]
2021-12-29 17:01 ` Jonathan Wakely
2021-12-29 17:04 ` Jonathan Wakely
2021-12-29 18:18 ` Tom Kacvinsky
2021-12-29 19:36 ` Jonathan Wakely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAG_eJLcFe46N16CVGO4jnhbP0oazo015oDtvOOXgNrOWs7QbdA@mail.gmail.com \
--to=tkacvins@gmail.com \
--cc=gcc-help@gcc.gnu.org \
--cc=jwakely.gcc@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).