[PATCH] D139881: [clang] Use a StringRef instead of a raw char pointer to store builtin and call information

Kadir Cetinkaya via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 16 01:45:14 PST 2022


kadircet added inline comments.


================
Comment at: clang-tools-extra/clangd/CompileCommands.cpp:469
     // Also grab prefixes for each option, these are not fully exposed.
-    const char *const *Prefixes[DriverID::LastOption] = {nullptr};
-#define PREFIX(NAME, VALUE) static const char *const NAME[] = VALUE;
+    llvm::StringLiteral Prefixes[DriverID::LastOption] = {};
+#define PREFIX(NAME, VALUE) static constexpr llvm::StringLiteral NAME[] = VALUE;
----------------
this is still wrong semantically (and i believe are failing tests/builds, you can see it in the premerge bot builds for yourself https://buildkite.com/llvm-project/premerge-checks/builds/126513#018510e5-592b-453e-a213-a2cffc9c9ac2).

This was an array of pointers to null-terminated string blocks. Now you're turning it into just an array of strings.

IIUC, your intention is to change a list of strings terminated with a nullptr into an arrayref. so this should itself be an `ArrayRef<StringLiteral>`s.


================
Comment at: clang-tools-extra/clangd/CompileCommands.cpp:470
+    llvm::StringLiteral Prefixes[DriverID::LastOption] = {};
+#define PREFIX(NAME, VALUE) static constexpr llvm::StringLiteral NAME[] = VALUE;
 #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,  \
----------------
why not directly store ArrayRef's here? instead of an empty string terminated array? (same for rest of the patch)


================
Comment at: clang-tools-extra/clangd/CompileCommands.cpp:502
       for (unsigned A = ID; A != DriverID::OPT_INVALID; A = NextAlias[A]) {
-        if (Prefixes[A] == nullptr) // option groups.
+        if (Prefixes[A].empty()) // option groups.
           continue;
----------------
previously this was checking for an empty array, now it's checking for an empty string. so semantics are completely diffrenet.


================
Comment at: clang-tools-extra/clangd/CompileCommands.cpp:511
         // Iterate over each spelling of the alias, e.g. -foo vs --foo.
-        for (auto *Prefix = Prefixes[A]; *Prefix != nullptr; ++Prefix) {
-          llvm::SmallString<64> Buf(*Prefix);
+        for (StringRef Prefix : ArrayRef<StringRef>(Prefixes, DriverID::LastOption - 1) ) {
+          llvm::SmallString<64> Buf(Prefix);
----------------
not even sure what was your intention here, but this was previously iterating over all the possible alternatives of a prefix until it hit the nullptr terminator. now you're making it iterate over something completely different (which i don't know how to describe).


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139881/new/

https://reviews.llvm.org/D139881



More information about the llvm-commits mailing list