#!/bin/sh # $PostgreSQL: pgsql/src/tools/find_typedef,v 1.15 2009/06/12 03:04:48 momjian Exp $ # 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)$'