aboutsummaryrefslogtreecommitdiff
path: root/gdb/contrib/test_pubnames_and_indexes.py
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/contrib/test_pubnames_and_indexes.py')
-rw-r--r--gdb/contrib/test_pubnames_and_indexes.py303
1 files changed, 160 insertions, 143 deletions
diff --git a/gdb/contrib/test_pubnames_and_indexes.py b/gdb/contrib/test_pubnames_and_indexes.py
index 67e2430..cc767a2 100644
--- a/gdb/contrib/test_pubnames_and_indexes.py
+++ b/gdb/contrib/test_pubnames_and_indexes.py
@@ -39,7 +39,7 @@ to those that gdb produces.
Finally, check that all strings are canonicalized identically.
"""
-__author__ = 'saugustine@google.com (Sterling Augustine)'
+__author__ = "saugustine@google.com (Sterling Augustine)"
import os
import subprocess
@@ -49,159 +49,176 @@ OBJCOPY = None
READELF = None
GDB = None
+
def get_pub_info(filename, readelf_option):
- """Parse and return all the pubnames or pubtypes produced by readelf with the
- given option.
- """
- readelf = subprocess.Popen([READELF, '--debug-dump=' + readelf_option,
- filename], stdout=subprocess.PIPE)
- pubnames = []
-
- in_list = False;
- for line in readelf.stdout:
- fields = line.split(None, 1)
- if (len(fields) == 2 and fields[0] == 'Offset'
- and fields[1].strip() == 'Name'):
- in_list = True
- # Either a blank-line or a new Length field terminates the current section.
- elif (len(fields) == 0 or fields[0] == 'Length:'):
- in_list = False;
- elif (in_list):
- pubnames.append(fields[1].strip())
-
- readelf.wait()
- return pubnames
+ """Parse and return all the pubnames or pubtypes produced by readelf with the
+ given option.
+ """
+ readelf = subprocess.Popen(
+ [READELF, "--debug-dump=" + readelf_option, filename], stdout=subprocess.PIPE
+ )
+ pubnames = []
+
+ in_list = False
+ for line in readelf.stdout:
+ fields = line.split(None, 1)
+ if len(fields) == 2 and fields[0] == "Offset" and fields[1].strip() == "Name":
+ in_list = True
+ # Either a blank-line or a new Length field terminates the current section.
+ elif len(fields) == 0 or fields[0] == "Length:":
+ in_list = False
+ elif in_list:
+ pubnames.append(fields[1].strip())
+
+ readelf.wait()
+ return pubnames
def get_gdb_index(filename):
- """Use readelf to dump the gdb index and collect the types and names"""
- readelf = subprocess.Popen([READELF, '--debug-dump=gdb_index',
- filename], stdout=subprocess.PIPE)
- index_symbols = []
- symbol_table_started = False
- for line in readelf.stdout:
- if (line == 'Symbol table:\n'):
- symbol_table_started = True;
- elif (symbol_table_started):
- # Readelf prints gdb-index lines formatted like so:
- # [ 4] two::c2<double>::c2: 0
- # So take the string between the first close bracket and the last colon.
- index_symbols.append(line[line.find(']') + 2: line.rfind(':')])
-
- readelf.wait()
- return index_symbols
+ """Use readelf to dump the gdb index and collect the types and names"""
+ readelf = subprocess.Popen(
+ [READELF, "--debug-dump=gdb_index", filename], stdout=subprocess.PIPE
+ )
+ index_symbols = []
+ symbol_table_started = False
+ for line in readelf.stdout:
+ if line == "Symbol table:\n":
+ symbol_table_started = True
+ elif symbol_table_started:
+ # Readelf prints gdb-index lines formatted like so:
+ # [ 4] two::c2<double>::c2: 0
+ # So take the string between the first close bracket and the last colon.
+ index_symbols.append(line[line.find("]") + 2 : line.rfind(":")])
+
+ readelf.wait()
+ return index_symbols
def CheckSets(list0, list1, name0, name1):
- """Report any setwise differences between the two lists"""
-
- if len(list0) == 0 or len(list1) == 0:
+ """Report any setwise differences between the two lists"""
+
+ if len(list0) == 0 or len(list1) == 0:
+ return False
+
+ difference0 = set(list0) - set(list1)
+ if len(difference0) != 0:
+ print "Elements in " + name0 + " but not " + name1 + ": (",
+ print len(difference0),
+ print ")"
+ for element in difference0:
+ print " " + element
+
+ difference1 = set(list1) - set(list0)
+ if len(difference1) != 0:
+ print "Elements in " + name1 + " but not " + name0 + ": (",
+ print len(difference1),
+ print ")"
+ for element in difference1:
+ print " " + element
+
+ if len(difference0) != 0 or len(difference1) != 0:
+ return True
+
+ print name0 + " and " + name1 + " are identical."
return False
- difference0 = set(list0) - set(list1)
- if len(difference0) != 0:
- print "Elements in " + name0 + " but not " + name1 + ": (",
- print len(difference0),
- print ")"
- for element in difference0:
- print " " + element
-
- difference1 = set(list1) - set(list0)
- if len(difference1) != 0:
- print "Elements in " + name1 + " but not " + name0 + ": (",
- print len(difference1),
- print ")"
- for element in difference1:
- print " " + element
-
- if (len(difference0) != 0 or len(difference1) != 0):
- return True
-
- print name0 + " and " + name1 + " are identical."
- return False
-
def find_executables():
- """Find the copies of readelf, objcopy and gdb to use."""
- # Executable finding logic follows cc-with-index.sh
- global READELF
- READELF = os.getenv('READELF')
- if READELF is None:
- READELF = 'readelf'
- global OBJCOPY
- OBJCOPY = os.getenv('OBJCOPY')
- if OBJCOPY is None:
- OBJCOPY = 'objcopy'
-
- global GDB
- GDB = os.getenv('GDB')
- if (GDB is None):
- if os.path.isfile('./gdb') and os.access('./gdb', os.X_OK):
- GDB = './gdb'
- elif os.path.isfile('../gdb') and os.access('../gdb', os.X_OK):
- GDB = '../gdb'
- elif os.path.isfile('../../gdb') and os.access('../../gdb', os.X_OK):
- GDB = '../../gdb'
- else:
- # Punt and use the gdb in the path.
- GDB = 'gdb'
+ """Find the copies of readelf, objcopy and gdb to use."""
+ # Executable finding logic follows cc-with-index.sh
+ global READELF
+ READELF = os.getenv("READELF")
+ if READELF is None:
+ READELF = "readelf"
+ global OBJCOPY
+ OBJCOPY = os.getenv("OBJCOPY")
+ if OBJCOPY is None:
+ OBJCOPY = "objcopy"
+
+ global GDB
+ GDB = os.getenv("GDB")
+ if GDB is None:
+ if os.path.isfile("./gdb") and os.access("./gdb", os.X_OK):
+ GDB = "./gdb"
+ elif os.path.isfile("../gdb") and os.access("../gdb", os.X_OK):
+ GDB = "../gdb"
+ elif os.path.isfile("../../gdb") and os.access("../../gdb", os.X_OK):
+ GDB = "../../gdb"
+ else:
+ # Punt and use the gdb in the path.
+ GDB = "gdb"
def main(argv):
- """The main subprogram."""
- if len(argv) != 2:
- print "Usage: test_pubnames_and_indexes.py <filename>"
- sys.exit(2)
-
- find_executables();
-
- # Get the index produced by Gold--It should have been built into the binary.
- gold_index = get_gdb_index(argv[1])
-
- # Collect the pubnames and types list
- pubs_list = get_pub_info(argv[1], "pubnames")
- pubs_list = pubs_list + get_pub_info(argv[1], "pubtypes")
-
- # Generate a .gdb_index with gdb
- gdb_index_file = argv[1] + '.gdb-generated-index'
- subprocess.check_call([OBJCOPY, '--remove-section', '.gdb_index',
- argv[1], gdb_index_file])
- subprocess.check_call([GDB, '-batch', '-nx', gdb_index_file,
- '-ex', 'save gdb-index ' + os.path.dirname(argv[1]),
- '-ex', 'quit'])
- subprocess.check_call([OBJCOPY, '--add-section',
- '.gdb_index=' + gdb_index_file + '.gdb-index',
- gdb_index_file])
- gdb_index = get_gdb_index(gdb_index_file)
- os.remove(gdb_index_file)
- os.remove(gdb_index_file + '.gdb-index')
-
- failed = False
- gdb_index.sort()
- gold_index.sort()
- pubs_list.sort()
-
- # Find the differences between the various indices.
- if len(gold_index) == 0:
- print "Gold index is empty"
- failed |= True
-
- if len(gdb_index) == 0:
- print "Gdb index is empty"
- failed |= True
-
- if len(pubs_list) == 0:
- print "Pubs list is empty"
- failed |= True
-
- failed |= CheckSets(gdb_index, gold_index, "gdb index", "gold index")
- failed |= CheckSets(pubs_list, gold_index, "pubs list", "gold index")
- failed |= CheckSets(pubs_list, gdb_index, "pubs list", "gdb index")
-
- if failed:
- print "Test failed"
- sys.exit(1)
-
-
-if __name__ == '__main__':
- main(sys.argv)
+ """The main subprogram."""
+ if len(argv) != 2:
+ print "Usage: test_pubnames_and_indexes.py <filename>"
+ sys.exit(2)
+
+ find_executables()
+
+ # Get the index produced by Gold--It should have been built into the binary.
+ gold_index = get_gdb_index(argv[1])
+
+ # Collect the pubnames and types list
+ pubs_list = get_pub_info(argv[1], "pubnames")
+ pubs_list = pubs_list + get_pub_info(argv[1], "pubtypes")
+
+ # Generate a .gdb_index with gdb
+ gdb_index_file = argv[1] + ".gdb-generated-index"
+ subprocess.check_call(
+ [OBJCOPY, "--remove-section", ".gdb_index", argv[1], gdb_index_file]
+ )
+ subprocess.check_call(
+ [
+ GDB,
+ "-batch",
+ "-nx",
+ gdb_index_file,
+ "-ex",
+ "save gdb-index " + os.path.dirname(argv[1]),
+ "-ex",
+ "quit",
+ ]
+ )
+ subprocess.check_call(
+ [
+ OBJCOPY,
+ "--add-section",
+ ".gdb_index=" + gdb_index_file + ".gdb-index",
+ gdb_index_file,
+ ]
+ )
+ gdb_index = get_gdb_index(gdb_index_file)
+ os.remove(gdb_index_file)
+ os.remove(gdb_index_file + ".gdb-index")
+
+ failed = False
+ gdb_index.sort()
+ gold_index.sort()
+ pubs_list.sort()
+
+ # Find the differences between the various indices.
+ if len(gold_index) == 0:
+ print "Gold index is empty"
+ failed |= True
+
+ if len(gdb_index) == 0:
+ print "Gdb index is empty"
+ failed |= True
+
+ if len(pubs_list) == 0:
+ print "Pubs list is empty"
+ failed |= True
+
+ failed |= CheckSets(gdb_index, gold_index, "gdb index", "gold index")
+ failed |= CheckSets(pubs_list, gold_index, "pubs list", "gold index")
+ failed |= CheckSets(pubs_list, gdb_index, "pubs list", "gdb index")
+
+ if failed:
+ print "Test failed"
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ main(sys.argv)