diff options
author | H. Peter Anvin (Intel) <hpa@zytor.com> | 2019-08-09 02:41:37 -0700 |
---|---|---|
committer | H. Peter Anvin (Intel) <hpa@zytor.com> | 2019-08-09 02:41:37 -0700 |
commit | 602e67f93261fd61e73a3b37e25d9be68c6bbffe (patch) | |
tree | 89fcbba50612f22ef3b7c8186cfcb633c0ab5ef4 /x86/insns-iflags.ph | |
parent | 1c21a53e4ed03371df5d9f16359545862bb4820e (diff) | |
download | nasm-602e67f93261fd61e73a3b37e25d9be68c6bbffe.tar.gz |
insns.pl: use less cantankerous string expansion; better error info
The flags massaging in insns.pl could end up with things like double
commas in some pathological cases, which would make insns_flag_index()
very unhappy due to the appearance of an empty argument. Fix this by
processing the flags as a list already in insns.pl.
Be more explicit and consistent in error messages.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Diffstat (limited to 'x86/insns-iflags.ph')
-rw-r--r-- | x86/insns-iflags.ph | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/x86/insns-iflags.ph b/x86/insns-iflags.ph index 208c1eed..a539974b 100644 --- a/x86/insns-iflags.ph +++ b/x86/insns-iflags.ph @@ -80,10 +80,11 @@ my $iflag_words; sub if_($$) { my($name, $def) = @_; - my $v = [$n_iflags++, $name, $def]; + my $num = $n_iflags++; + my $v = [$num, $name, $def]; $flag_byname{$name} = $v; - $flag_bynum[$v->[0]] = $v; + $flag_bynum[$num] = $v; return 1; } @@ -122,24 +123,25 @@ sub insns_flag_index(@) { my @prekey = sort(@_); my $key = join(',', @prekey); + my $flag_index = $insns_flag_hash{$key}; - if (not defined($insns_flag_hash{$key})) { + unless (defined($flag_index)) { my @newkey = (0) x $iflag_words; - for my $i (@prekey) { - die "No key for $i\n" if not defined($flag_byname{$i}); - $newkey[$flag_byname{$i}->[0] >> 5] |= - (1 << ($flag_byname{$i}->[0] & 31)); + foreach my $i (@prekey) { + my $flag = $flag_byname{$i}; + die "No key for $i (in $key)\n" if not defined($flag); + $newkey[$flag->[0] >> 5] |= (1 << ($flag->[0] & 31)); } my $str = join(',', map { sprintf("UINT32_C(0x%08x)",$_) } @newkey); push @insns_flag_values, $str; push @insns_flag_lists, $key; - $insns_flag_hash{$key} = $#insns_flag_values; + $insns_flag_hash{$key} = $flag_index = $#insns_flag_values; } - return $insns_flag_hash{$key}; + return $flag_index; } sub write_iflaggen_h() { |