From: Nathan Sidwell Date: Thu, 20 Oct 2022 11:10:47 +0000 (-0400) Subject: libcxxabi [PR58117][NFC]: Open code lower bound X-Git-Tag: upstream/17.0.6~30032 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c7ca21436d626b188d87774044d4c087cbbe7fcf;p=platform%2Fupstream%2Fllvm.git libcxxabi [PR58117][NFC]: Open code lower bound This open codes the use of lower-bound when looking for an operator encoding. Using std::lower_bound can result in symbol references to the C++ library and that breaks the ABI demangler, which mandates no such dependency. Differential Revision: https://reviews.llvm.org/D135799 Fixes: https://github.com/llvm/llvm-project/issues/58117 --- diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index fa121cc..3399825 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -3032,14 +3032,21 @@ AbstractManglingParser::parseOperatorEncoding() { if (numLeft() < 2) return nullptr; - auto Op = std::lower_bound( - &Ops[0], &Ops[NumOps], First, - [](const OperatorInfo &Op_, const char *Enc_) { return Op_ < Enc_; }); - if (Op == &Ops[NumOps] || *Op != First) + // We can't use lower_bound as that can link to symbols in the C++ library, + // and this must remain independant of that. + size_t lower = 0u, upper = NumOps - 1; // Inclusive bounds. + while (upper != lower) { + size_t middle = (upper + lower) / 2; + if (Ops[middle] < First) + lower = middle + 1; + else + upper = middle; + } + if (Ops[lower] != First) return nullptr; First += 2; - return Op; + return &Ops[lower]; } // ::= See parseOperatorEncoding() diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index aa19b29..ea55f4a 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -3032,14 +3032,21 @@ AbstractManglingParser::parseOperatorEncoding() { if (numLeft() < 2) return nullptr; - auto Op = std::lower_bound( - &Ops[0], &Ops[NumOps], First, - [](const OperatorInfo &Op_, const char *Enc_) { return Op_ < Enc_; }); - if (Op == &Ops[NumOps] || *Op != First) + // We can't use lower_bound as that can link to symbols in the C++ library, + // and this must remain independant of that. + size_t lower = 0u, upper = NumOps - 1; // Inclusive bounds. + while (upper != lower) { + size_t middle = (upper + lower) / 2; + if (Ops[middle] < First) + lower = middle + 1; + else + upper = middle; + } + if (Ops[lower] != First) return nullptr; First += 2; - return Op; + return &Ops[lower]; } // ::= See parseOperatorEncoding()