xref: /llvm-project/llvm/utils/TableGen/Common/OptEmitter.cpp (revision d3cdf0f2220cb913092934d7bf08c89951d56f8d)
15f25b895SRahul Joshi //===- OptEmitter.cpp - Helper for emitting options -------------*- C++ -*-===//
2fa3d789dSPierre van Houtryve //
3fa3d789dSPierre van Houtryve // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fa3d789dSPierre van Houtryve // See https://llvm.org/LICENSE.txt for license information.
5fa3d789dSPierre van Houtryve // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fa3d789dSPierre van Houtryve //
7fa3d789dSPierre van Houtryve //===----------------------------------------------------------------------===//
8fa3d789dSPierre van Houtryve 
9fa3d789dSPierre van Houtryve #include "OptEmitter.h"
10fa3d789dSPierre van Houtryve #include "llvm/ADT/Twine.h"
11*d3cdf0f2SRahul Joshi #include "llvm/Support/OptionStrCmp.h"
12fa3d789dSPierre van Houtryve #include "llvm/TableGen/Error.h"
13fa3d789dSPierre van Houtryve #include "llvm/TableGen/Record.h"
14fa3d789dSPierre van Houtryve 
155f25b895SRahul Joshi // Returns true if A is ordered before B.
16*d3cdf0f2SRahul Joshi bool llvm::IsOptionRecordsLess(const Record *A, const Record *B) {
17ccc4fa18SRahul Joshi   if (A == B)
18ccc4fa18SRahul Joshi     return false;
19*d3cdf0f2SRahul Joshi 
20fa3d789dSPierre van Houtryve   // Sentinel options precede all others and are only ordered by precedence.
21*d3cdf0f2SRahul Joshi   const Record *AKind = A->getValueAsDef("Kind");
22*d3cdf0f2SRahul Joshi   const Record *BKind = B->getValueAsDef("Kind");
23*d3cdf0f2SRahul Joshi 
24*d3cdf0f2SRahul Joshi   bool ASent = AKind->getValueAsBit("Sentinel");
25*d3cdf0f2SRahul Joshi   bool BSent = BKind->getValueAsBit("Sentinel");
26fa3d789dSPierre van Houtryve   if (ASent != BSent)
275f25b895SRahul Joshi     return ASent;
28fa3d789dSPierre van Houtryve 
29fa3d789dSPierre van Houtryve   std::vector<StringRef> APrefixes = A->getValueAsListOfStrings("Prefixes");
30fa3d789dSPierre van Houtryve   std::vector<StringRef> BPrefixes = B->getValueAsListOfStrings("Prefixes");
31fa3d789dSPierre van Houtryve 
32*d3cdf0f2SRahul Joshi   // Compare options by name, unless they are sentinels.
33*d3cdf0f2SRahul Joshi   if (!ASent) {
34*d3cdf0f2SRahul Joshi     if (int Cmp = StrCmpOptionName(A->getValueAsString("Name"),
35*d3cdf0f2SRahul Joshi                                    B->getValueAsString("Name")))
365f25b895SRahul Joshi       return Cmp < 0;
37*d3cdf0f2SRahul Joshi 
38*d3cdf0f2SRahul Joshi     if (int Cmp = StrCmpOptionPrefixes(APrefixes, BPrefixes))
39*d3cdf0f2SRahul Joshi       return Cmp < 0;
40fa3d789dSPierre van Houtryve   }
41fa3d789dSPierre van Houtryve 
42fa3d789dSPierre van Houtryve   // Then by the kind precedence;
43*d3cdf0f2SRahul Joshi   int APrec = AKind->getValueAsInt("Precedence");
44*d3cdf0f2SRahul Joshi   int BPrec = BKind->getValueAsInt("Precedence");
45*d3cdf0f2SRahul Joshi   if (APrec == BPrec && APrefixes == BPrefixes) {
46fa3d789dSPierre van Houtryve     PrintError(A->getLoc(), Twine("Option is equivalent to"));
47fa3d789dSPierre van Houtryve     PrintError(B->getLoc(), Twine("Other defined here"));
48fa3d789dSPierre van Houtryve     PrintFatalError("Equivalent Options found.");
49fa3d789dSPierre van Houtryve   }
505f25b895SRahul Joshi   return APrec < BPrec;
51fa3d789dSPierre van Houtryve }
52