Hello there,

hope you are all doing well.


While working with libdwarf/dwarfdump,  I noticed the following behavior.

Suppose we have the following code:


```C++
#ifndef CCHANNEL_HPP_
#define CCHANNEL_HPP_

class CChannel
{
   public:
    typedef enum
    {
        UNUSED   = 0,
        INACTIVE = 1,
        ACTIVE   = 2,
    } TState;

    typedef struct
    {
        TState State;
        int    data;
    } SHK;

    CChannel();
    virtual void getData();
    ~CChannel();

   private:
    SHK Hk;
};

#endif /* CCHANNEL_HPP_ */
```

It seems that if there is a virtual method inside of a class, the DWARF outputs `SHK` struct as an anonymous struct. This means that an instantiation of SHK will show a structure with all the info, except the name itself("SHK" in this case).


Interestingly enough if the struct declaration is  written as the following, it does not treat it as a an anonymous struct:


```C++
    typedef struct SHK
    {
        TState State;
        int    data;
    } SHK;
```

Assuming this is how it is used:
```C++
#ifndef VC_MSGS_H
#define VC_MSGS_H

#include "cchannel.hpp"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{
    int           data;
    CChannel::SHK Channel[1];
} HkTlm_t;

#ifdef __cplusplus
}
#endif

#endif /* VC_MSG_H */
```

It also does not happen if `Channel` is just a member instead of an array (even if there is a virtual method in CChannel):
```C++
#ifndef VC_MSGS_H
#define VC_MSGS_H

#include "cchannel.hpp"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{
    int           data;
    CChannel::SHK Channel;
} HkTlm_t;

#ifdef __cplusplus
}
#endif

#endif /* VC_MSG_H */

```


I'm just looking for some clarification to make sure I understand what is going on here and not going down the wrong path....

Here is some info about my machine

gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

NAME="Pop!_OS"
VERSION="20.04 LTS"
ID=pop
ID_LIKE="ubuntu debian"
PRETTY_NAME="Pop!_OS 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://pop.system76.com";
SUPPORT_URL="https://support.system76.com";
BUG_REPORT_URL="https://github.com/pop-os/pop/issues";
PRIVACY_POLICY_URL="https://system76.com/privacy";
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
LOGO=distributor-logo-pop-os


Hope I was clear enough about my report. I know it's a bit all over the place, but my main concern is making sure /when//under what circumstances will gcc link the variable to the anonymous struct  instead of typedef so I can document a tool I work on that relies on libdwarf correctly.


Thanks in advance

Lorenzo


-- 
Dwarf-discuss mailing list
Dwarf-discuss@lists.dwarfstd.org
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss

Reply via email to