| #!/bin/sh |
| |
| # src/tools/find_typedef |
| |
| # This script attempts to find all typedef's in the postgres binaries |
| # by using 'nm' to report all typedef debugging symbols. |
| # |
| # For this program to work, you must have compiled all binaries with |
| # debugging symbols. |
| # |
| # This is run on BSD/OS 4.0 or Linux, so you may need to make changes. |
| # |
| # Ignore the nm errors about a file not being a binary file. |
| # |
| # It gets typedefs by reading "STABS": |
| # |
| # http://www.informatik.uni-frankfurt.de/doc/texi/stabs_toc.html |
| # |
| # objdump: |
| # -G, --stabs Display (in raw form) any STABS info in the file |
| # |
| # --stabs |
| # Display the contents of the .stab, .stab.index, and |
| # .stab.excl sections from an ELF file. This is only |
| # useful on systems (such as Solaris 2.0) in which |
| # .stab debugging symbol-table entries are carried in |
| # an ELF section. In most other file formats, debug- |
| # ging symbol-table entries are interleaved with |
| # linkage symbols, and are visible in the --syms out- |
| # put. |
| |
| |
| if [ "$#" -eq 0 -o ! -d "$1" ] |
| then echo "Usage: $0 postgres_binary_directory [...]" 1>&2 |
| exit 1 |
| fi |
| |
| for DIR |
| do # if objdump -W is recognized, only one line of error should appear |
| if [ `objdump -W 2>&1 | wc -l` -eq 1 ] |
| then # Linux |
| # Unfortunately the Linux version doesn't show unreferenced typedefs. |
| # The problem is that they are still in the source code so should be |
| # indented properly. However, I think pgindent only cares about |
| # the typedef references, not the definitions, so I think it might |
| # be fine |
| objdump -W "$DIR"/* | |
| egrep -A3 '\(DW_TAG_typedef\)' | |
| awk ' $2 == "DW_AT_name" {print $NF}' |
| elif [ `readelf -w 2>&1 | wc -l` -gt 1 ] |
| then # FreeBSD, similar output to Linux |
| readelf -w "$DIR"/* | |
| egrep -A3 '\(DW_TAG_typedef\)' | |
| awk ' $1 == "DW_AT_name" {print $NF}' |
| else # BSD/OS |
| # BSD/OS reports all typedefs, even those defined in system |
| # include files but never referenced in the PG code. |
| objdump --stabs "$DIR"/* | |
| awk ' $2 == "LSYM" && $7 ~ /:t/ {sub(":.*", "", $7); print $7}' |
| fi |
| done | |
| grep -v ' ' | # some typedefs have spaces, remove them |
| sort | |
| uniq | |
| # these are used both for typedefs and variable names |
| # so do not include them |
| egrep -v '^(date|interval|timestamp|ANY)$' |