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