Fwd: [PATCH 2/4] covoar: Use DWARF to map addresses to source files and lines.

Chris Johns chrisj at rtems.org
Mon May 7 22:09:04 UTC 2018


On 08/05/2018 07:32, Joel Sherrill wrote:
> On Mon, May 7, 2018 at 3:58 PM, Chris Johns <chrisj at rtems.org
> <mailto:chrisj at rtems.org>> wrote:
> 
>     On 08/05/2018 03:56, Joel Sherrill wrote:
>     > 
>     > I have attached a workaround.
> 
>     Looks like a solution to me.
> 
> 
> Good enough for now. All basename() calls should come from rld. 
> 
> Eventually all dirname() calls should also.
> 
> Luckily no file uses both so we don't have to include libgen.h when
> for dirname() and screw up basename().

Works on FreeBSD ;)

>     > It seems that libgen.h has this:
>     > 
>     > ========================================================
>     > /* Return final component of PATH.
>     > 
>     >    This is the weird XPG version of this function.  It sometimes will
>     >    modify its argument.  Therefore we normally use the GNU version (in
>     >    <string.h>) and only if this header is included make the XPG
>     >    version available under the real name.  */
>     > extern char *__xpg_basename (char *__path) __THROW;
>     > #define basename        __xpg_basename
>     > ========================================================
>     >
> 
>     Oh yuck, who would ever work in standards. ;)
> 
>     Is this function allowed to be redefined as a macro?
> 
> 
> http://pubs.opengroup.org/onlinepubs/9699919799/functions/basename.html
> http://pubs.opengroup.org/onlinepubs/9699919799/functions/dirname.html
> 
> Neither seems to say anything about that. Both have language like this:
> 
> " The /dirname/() function may modify the string pointed to by /path/, and may
> return a pointer to static storage that may then be overwritten by a subsequent
> call to /dirname/()."
> 
> It really would be better to have our own implementations and not
> use the standard basename() and dirname(). The POSIX ones
> are not thread-safe.

We have them in rld-path. It is a little like the python os.path module.

> 
>     > Chris has used basename as a method name and even though that should
>     > be perfectly acceptable, the macro above gets expanded, the name 
>     > gets changed (in some places) to rld::path::__xpg_basename()
>     > 
>     >       r.lowSourceLine = rld::path::basename (location);
>     > 
>     > IMO the fix is to add dirname to rld-files, use rld basename and dirname
>     > exclusively, and avoid libgen.h at all costs.
> 
>     Wouldn't the world be so much simpler if there was only Linux? ;)
> 
> 
> The methods as defined by POSIX aren't thread-safe and can 
> modify the caller's string. Suck by design. :)
> 
> Having one mono-culture is easy but it doesn't make it right
> even when conformant. :)

It is a horrible implementation and not safe in C++.

> 
>     > I didn't do that much work. I got lucky in a couple of files by removing the
>     > include of libgen.h since it wasn't needed but I had to leave it in one place.
>     > 
>     > $ grep dirname *.cc
>     > GcovData.cc:    dirname( path );
>     > 
>     > Hopefully this lets you all proceed with Chris' patches and my slight hack
>     > in place.
>     > 
>     > Ultimate solution is probably simple. We just need to hear from Chris.
> 
>     This is fine. I am slowing move covoar to use more and more of the rtemstoolkit.
> 
>     I will merge these changes into a v2 patch set.
> 
> 
> Are you adding dirname()? Or does that need a ticket?
> 

Confused....

https://git.rtems.org/rtems-tools/tree/rtemstoolkit/rld-path.h#n52

?

Chris


More information about the devel mailing list