Skip to content

Commit

Permalink
[Utils][LoongArch](5/6) Add a --bits-endian option to extract-section.py
Browse files Browse the repository at this point in the history
This is a split patch of D115862 which adds a --bits-endian option to
extract-section to make it possible to print bits in specified endianness.
It means that we can print instruction encoding of some targets like LoongArch
as bits[0] to bits[31] from right to left by specifing --bits-endian little.

Differential revision: https://reviews.llvm.org/D116100
  • Loading branch information
SixWeining authored and rengolin committed Feb 10, 2022
1 parent 33388ae commit 6caee48
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions llvm/utils/extract-section.py
Expand Up @@ -59,14 +59,17 @@ def get_raw_section_dump(readobj_path, section_name, input_file):
help='Print out in bits')
arg_parser.add_argument('--byte-indicator', action='store_true',
help='Whether to print a \'.\' every 8 bits in bits printing mode')
arg_parser.add_argument('--bits-endian', metavar='<little/big>', type=str,
choices=['little', 'big'],
help='Print out bits in specified endianness (little or big); defaults to big')
format_group.add_argument('-h', dest='format', action='store_const', const='hex',
help='Print out in hexadecimal')
arg_parser.add_argument('--hex-width', metavar='<# of bytes>', type=int,
help='The width (in byte) of every element in hex printing mode')

arg_parser.add_argument('--help', action='help')
arg_parser.set_defaults(format='bits', tool_path='llvm-readobj', input_file='-',
byte_indicator=False, hex_width=4)
byte_indicator=False, hex_width=4, bits_endian='big')
args = arg_parser.parse_args()

raw_section = get_raw_section_dump(args.tool_path, args.section, args.input_file)
Expand All @@ -82,7 +85,10 @@ def get_raw_section_dump(readobj_path, section_name, input_file):
val = int(part, 16)
if args.format == 'bits':
# divided into bytes first
for byte in [(val >> off) & 0xFF for off in (24,16,8,0)]:
offsets = (24, 16, 8, 0)
if args.bits_endian == 'little':
offsets = (0, 8, 16, 24)
for byte in [(val >> off) & 0xFF for off in offsets]:
for bit in [(byte >> off) & 1 for off in range(7, -1, -1)]:
results.append(str(bit))
if args.byte_indicator:
Expand Down

0 comments on commit 6caee48

Please sign in to comment.