3232#include " llvm/Support/CommandLine.h"
3333#include " llvm/Support/Debug.h"
3434#include " llvm/Support/ErrorHandling.h"
35- #include " llvm/Support/FormatVariadic.h"
3635#include " llvm/Support/FormattedStream.h"
3736#include " llvm/Support/LEB128.h"
38- #include " llvm/Support/MathExtras.h"
3937#include " llvm/Support/raw_ostream.h"
4038#include " llvm/TableGen/Error.h"
4139#include " llvm/TableGen/Record.h"
@@ -78,12 +76,6 @@ static cl::opt<SuppressLevel> DecoderEmitterSuppressDuplicates(
7876 " significantly reducing Table Duplications" )),
7977 cl::init(SUPPRESSION_DISABLE), cl::cat(DisassemblerEmitterCat));
8078
81- static cl::opt<uint32_t >
82- NumToSkipSizeInBytes (" num-to-skip-size" ,
83- cl::desc (" number of bytes to use for num-to-skip "
84- " entries in the decoder table (2 or 3)" ),
85- cl::init(2 ), cl::cat(DisassemblerEmitterCat));
86-
8779STATISTIC (NumEncodings, " Number of encodings considered" );
8880STATISTIC (NumEncodingsLackingDisasm,
8981 " Number of encodings without disassembler info" );
@@ -138,29 +130,10 @@ struct DecoderTable : public std::vector<uint8_t> {
138130 // in the table for patching.
139131 size_t insertNumToSkip () {
140132 size_t Size = size ();
141- insert (end (), NumToSkipSizeInBytes , 0 );
133+ insert (end (), 3 , 0 );
142134 return Size;
143135 }
144-
145- void patchNumToSkip (size_t FixupIdx, uint32_t DestIdx) {
146- // Calculate the distance from the byte following the fixup entry byte
147- // to the destination. The Target is calculated from after the
148- // `NumToSkipSizeInBytes`-byte NumToSkip entry itself, so subtract
149- // `NumToSkipSizeInBytes` from the displacement here to account for that.
150- assert (DestIdx >= FixupIdx + NumToSkipSizeInBytes &&
151- " Expecting a forward jump in the decoding table" );
152- uint32_t Delta = DestIdx - FixupIdx - NumToSkipSizeInBytes;
153- if (!isUIntN (8 * NumToSkipSizeInBytes, Delta))
154- PrintFatalError (
155- " disassembler decoding table too large, try --num-to-skip-size=3" );
156-
157- (*this )[FixupIdx] = static_cast <uint8_t >(Delta);
158- (*this )[FixupIdx + 1 ] = static_cast <uint8_t >(Delta >> 8 );
159- if (NumToSkipSizeInBytes == 3 )
160- (*this )[FixupIdx + 2 ] = static_cast <uint8_t >(Delta >> 16 );
161- }
162136};
163-
164137struct DecoderTableInfo {
165138 DecoderTable Table;
166139 FixupScopeList FixupStack;
@@ -717,8 +690,19 @@ static void resolveTableFixups(DecoderTable &Table, const FixupList &Fixups,
717690 uint32_t DestIdx) {
718691 // Any NumToSkip fixups in the current scope can resolve to the
719692 // current location.
720- for (uint32_t FixupIdx : Fixups)
721- Table.patchNumToSkip (FixupIdx, DestIdx);
693+ for (uint32_t FixupIdx : reverse (Fixups)) {
694+ // Calculate the distance from the byte following the fixup entry byte
695+ // to the destination. The Target is calculated from after the 24-bit
696+ // NumToSkip entry itself, so subtract three from the displacement here
697+ // to account for that.
698+ uint32_t Delta = DestIdx - FixupIdx - 3 ;
699+ // Our NumToSkip entries are 24-bits. Make sure our table isn't too
700+ // big.
701+ assert (isUInt<24 >(Delta));
702+ Table[FixupIdx] = (uint8_t )Delta;
703+ Table[FixupIdx + 1 ] = (uint8_t )(Delta >> 8 );
704+ Table[FixupIdx + 2 ] = (uint8_t )(Delta >> 16 );
705+ }
722706}
723707
724708// Emit table entries to decode instructions given a segment or segments
@@ -775,9 +759,15 @@ void Filter::emitTableEntry(DecoderTableInfo &TableInfo) const {
775759 Delegate->emitTableEntries (TableInfo);
776760
777761 // Now that we've emitted the body of the handler, update the NumToSkip
778- // of the filter itself to be able to skip forward when false.
779- if (PrevFilter)
780- Table.patchNumToSkip (PrevFilter, Table.size ());
762+ // of the filter itself to be able to skip forward when false. Subtract
763+ // three as to account for the width of the NumToSkip field itself.
764+ if (PrevFilter) {
765+ uint32_t NumToSkip = Table.size () - PrevFilter - 3 ;
766+ assert (isUInt<24 >(NumToSkip) && " disassembler decoding table too large!" );
767+ Table[PrevFilter] = (uint8_t )NumToSkip;
768+ Table[PrevFilter + 1 ] = (uint8_t )(NumToSkip >> 8 );
769+ Table[PrevFilter + 2 ] = (uint8_t )(NumToSkip >> 16 );
770+ }
781771 }
782772
783773 // If there is no fallthrough, then the final filter should get fixed
@@ -824,8 +814,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
824814 OS << (unsigned )*I++ << " , " ;
825815 };
826816
827- // Emit `NumToSkipSizeInBytes`-byte numtoskip value to OS, returning the
828- // NumToSkip value.
817+ // Emit 24-bit numtoskip value to OS, returning the NumToSkip value.
829818 auto emitNumToSkip = [](DecoderTable::const_iterator &I,
830819 formatted_raw_ostream &OS) {
831820 uint8_t Byte = *I++;
@@ -834,11 +823,9 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
834823 Byte = *I++;
835824 OS << (unsigned )Byte << " , " ;
836825 NumToSkip |= Byte << 8 ;
837- if (NumToSkipSizeInBytes == 3 ) {
838- Byte = *I++;
839- OS << (unsigned )(Byte) << " , " ;
840- NumToSkip |= Byte << 16 ;
841- }
826+ Byte = *I++;
827+ OS << (unsigned )(Byte) << " , " ;
828+ NumToSkip |= Byte << 16 ;
842829 return NumToSkip;
843830 };
844831
@@ -880,7 +867,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
880867 // The filter value is ULEB128 encoded.
881868 emitULEB128 (I, OS);
882869
883- // numtoskip value.
870+ // 24-bit numtoskip value.
884871 uint32_t NumToSkip = emitNumToSkip (I, OS);
885872 OS << " // Skip to: " << ((I - Table.begin ()) + NumToSkip) << " \n " ;
886873 break ;
@@ -896,7 +883,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
896883 // ULEB128 encoded field value.
897884 emitULEB128 (I, OS);
898885
899- // numtoskip value.
886+ // 24-bit numtoskip value.
900887 uint32_t NumToSkip = emitNumToSkip (I, OS);
901888 OS << " // Skip to: " << ((I - Table.begin ()) + NumToSkip) << " \n " ;
902889 break ;
@@ -906,7 +893,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
906893 OS << Indent << " MCD::OPC_CheckPredicate, " ;
907894 emitULEB128 (I, OS);
908895
909- // numtoskip value.
896+ // 24-bit numtoskip value.
910897 uint32_t NumToSkip = emitNumToSkip (I, OS);
911898 OS << " // Skip to: " << ((I - Table.begin ()) + NumToSkip) << " \n " ;
912899 break ;
@@ -938,7 +925,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
938925
939926 // Fallthrough for OPC_TryDecode.
940927
941- // numtoskip value.
928+ // 24-bit numtoskip value.
942929 uint32_t NumToSkip = emitNumToSkip (I, OS);
943930
944931 OS << " // Opcode: " << NumberedEncodings[EncodingID]
@@ -1424,9 +1411,9 @@ void FilterChooser::emitSingletonTableEntry(DecoderTableInfo &TableInfo,
14241411 TableInfo.Table .push_back (NumBits);
14251412 TableInfo.Table .insertULEB128 (Ilnd.FieldVal );
14261413
1427- // Allocate space in the table for fixup (NumToSkipSizeInBytes) so all
1428- // our relative position calculations work OK even before we fully
1429- // resolve the real value here.
1414+ // The fixup is always 24-bits, so go ahead and allocate the space
1415+ // in the table so all our relative position calculations work OK even
1416+ // before we fully resolve the real value here.
14301417
14311418 // Push location for NumToSkip backpatching.
14321419 TableInfo.FixupStack .back ().push_back (TableInfo.Table .insertNumToSkip ());
@@ -2170,18 +2157,7 @@ insertBits(InsnType &field, uint64_t bits, unsigned startBit, unsigned numBits)
21702157// decodeInstruction().
21712158static void emitDecodeInstruction (formatted_raw_ostream &OS,
21722159 bool IsVarLenInst) {
2173- OS << formatv (" \n constexpr unsigned NumToSkipSizeInBytes = {};\n " ,
2174- NumToSkipSizeInBytes);
2175-
21762160 OS << R"(
2177- inline unsigned decodeNumToSkip(const uint8_t *&Ptr) {
2178- unsigned NumToSkip = *Ptr++;
2179- NumToSkip |= (*Ptr++) << 8;
2180- if constexpr (NumToSkipSizeInBytes == 3)
2181- NumToSkip |= (*Ptr++) << 16;
2182- return NumToSkip;
2183- }
2184-
21852161template <typename InsnType>
21862162static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
21872163 InsnType insn, uint64_t Address,
@@ -2219,7 +2195,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22192195 // Decode the field value.
22202196 uint64_t Val = decodeULEB128AndIncUnsafe(++Ptr);
22212197 bool Failed = Val != CurFieldValue;
2222- unsigned NumToSkip = decodeNumToSkip(Ptr);
2198+ // NumToSkip is a plain 24-bit integer.
2199+ unsigned NumToSkip = *Ptr++;
2200+ NumToSkip |= (*Ptr++) << 8;
2201+ NumToSkip |= (*Ptr++) << 16;
22232202
22242203 // Perform the filter operation.
22252204 if (Failed)
@@ -2243,7 +2222,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22432222 uint64_t ExpectedValue = decodeULEB128(++Ptr, &PtrLen);
22442223 Ptr += PtrLen;
22452224 bool Failed = ExpectedValue != FieldValue;
2246- unsigned NumToSkip = decodeNumToSkip(Ptr);
2225+ // NumToSkip is a plain 24-bit integer.
2226+ unsigned NumToSkip = *Ptr++;
2227+ NumToSkip |= (*Ptr++) << 8;
2228+ NumToSkip |= (*Ptr++) << 16;
22472229
22482230 // If the actual and expected values don't match, skip.
22492231 if (Failed)
@@ -2258,7 +2240,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22582240 case MCD::OPC_CheckPredicate: {
22592241 // Decode the Predicate Index value.
22602242 unsigned PIdx = decodeULEB128AndIncUnsafe(++Ptr);
2261- unsigned NumToSkip = decodeNumToSkip(Ptr);
2243+ // NumToSkip is a plain 24-bit integer.
2244+ unsigned NumToSkip = *Ptr++;
2245+ NumToSkip |= (*Ptr++) << 8;
2246+ NumToSkip |= (*Ptr++) << 16;
22622247 // Check the predicate.
22632248 bool Failed = !checkDecoderPredicate(PIdx, Bits);
22642249 if (Failed)
@@ -2293,7 +2278,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22932278 // Decode the Opcode value.
22942279 unsigned Opc = decodeULEB128AndIncUnsafe(++Ptr);
22952280 unsigned DecodeIdx = decodeULEB128AndIncUnsafe(Ptr);
2296- unsigned NumToSkip = decodeNumToSkip(Ptr);
2281+ // NumToSkip is a plain 24-bit integer.
2282+ unsigned NumToSkip = *Ptr++;
2283+ NumToSkip |= (*Ptr++) << 8;
2284+ NumToSkip |= (*Ptr++) << 16;
22972285
22982286 // Perform the decode operation.
22992287 MCInst TmpMI;
@@ -2418,9 +2406,6 @@ handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
24182406
24192407// Emits disassembler code for instruction decoding.
24202408void DecoderEmitter::run (raw_ostream &o) {
2421- if (NumToSkipSizeInBytes != 2 && NumToSkipSizeInBytes != 3 )
2422- PrintFatalError (" Invalid value for num-to-skip-size, must be 2 or 3" );
2423-
24242409 formatted_raw_ostream OS (o);
24252410 OS << R"(
24262411#include "llvm/MC/MCInst.h"
0 commit comments