[PATCH] D148799: [clang] Return `StringRef` from `TargetInfo::getClobbers()`

Sviatoslav Osipov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 21 07:07:29 PDT 2023


Stoorx added a comment.

I've looked through usages of `getClobbers` again, and found that in each case the result if the function is casted to `std::string`.

  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGStmt.cpp
  
  std::string Constraints = "=r,*Z,~{memory}";
    std::string MachineClobbers =
        static_cast<std::string>(CGF.getTarget().getClobbers());
    if (!MachineClobbers.empty()) {
      Constraints += ',';
      Constraints += MachineClobbers;
    }

I think we can 'make two deals with one shot' if we would:

- Make `std::string_view` as a return type of `getClobbers` (by value, since the `std::string_view` is 'TriviallyCopyable')
- (Maybe) Make private static field of `std::string` type for actual clobber value (or `std::string_view` type since it can be constexpr-constructed)
- Return the value of this field from `getClobbers`
- Change type of MachineClobbers (in usages, see example above) variable to `std::string_view` since it actually used for read-only access. (We do not need to construct `std::string` and destruct it almost immediately)

As a result we get:

- More robust usage of `getClobbers` (a bit ridiculous but...)
- Zero unnecessary allocations

(Also: I've discovered that `llvm::StringRef` is exact the same thing as `std::string_view`. I think of it so much :^) )


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

https://reviews.llvm.org/D148799



More information about the cfe-commits mailing list