https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/153210
>From 16f070ca2111cdb4e2e75a9d2b6506e523e841b6 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Tue, 12 Aug 2025 21:08:47 +0900 Subject: [PATCH] RuntimeLibcalls: Generate table of libcall name lengths Avoids strlen when constructing the returned StringRef. We were emitting these in the libcall name lookup anyway, so split out the offsets for general use. Currently emitted as a separate table, not sure if it would be better to change the string offset table to store pairs of offset and width instead. --- llvm/include/llvm/IR/RuntimeLibcalls.h | 5 +++- llvm/test/TableGen/RuntimeLibcallEmitter.td | 22 +++++++++++++---- .../TableGen/Basic/RuntimeLibcallsEmitter.cpp | 24 ++++++++++++------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h index 620774fd296e3..308be543de2bd 100644 --- a/llvm/include/llvm/IR/RuntimeLibcalls.h +++ b/llvm/include/llvm/IR/RuntimeLibcalls.h @@ -85,7 +85,9 @@ struct RuntimeLibcallsInfo { static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl) { if (CallImpl == RTLIB::Unsupported) return StringRef(); - return RuntimeLibcallImplNameTable[RuntimeLibcallNameOffsetTable[CallImpl]]; + return StringRef(RuntimeLibcallImplNameTable.getCString( + RuntimeLibcallNameOffsetTable[CallImpl]), + RuntimeLibcallNameSizeTable[CallImpl]); } /// Return the lowering's selection of implementation call for \p Call @@ -182,6 +184,7 @@ struct RuntimeLibcallsInfo { LLVM_ABI static const char RuntimeLibcallImplNameTableStorage[]; LLVM_ABI static const StringTable RuntimeLibcallImplNameTable; LLVM_ABI static const uint16_t RuntimeLibcallNameOffsetTable[]; + LLVM_ABI static const uint8_t RuntimeLibcallNameSizeTable[]; /// Map from a concrete LibcallImpl implementation to its RTLIB::Libcall kind. LLVM_ABI static const RTLIB::Libcall ImplToLibcall[RTLIB::NumLibcallImpls]; diff --git a/llvm/test/TableGen/RuntimeLibcallEmitter.td b/llvm/test/TableGen/RuntimeLibcallEmitter.td index 54ca3f97e2d4b..c83bc7b34b432 100644 --- a/llvm/test/TableGen/RuntimeLibcallEmitter.td +++ b/llvm/test/TableGen/RuntimeLibcallEmitter.td @@ -137,6 +137,18 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi // CHECK-NEXT: 54, // sqrtl // CHECK-NEXT: 54, // sqrtl // CHECK-NEXT: }; +// CHECK-EMPTY: +// CHECK-NEXT: const uint8_t RTLIB::RuntimeLibcallsInfo::RuntimeLibcallNameSizeTable[] = { +// CHECK-NEXT: 9, +// CHECK-NEXT: 9, +// CHECK-NEXT: 9, +// CHECK-NEXT: 9, +// CHECK-NEXT: 5, +// CHECK-NEXT: 6, +// CHECK-NEXT: 5, +// CHECK-NEXT: 5, +// CHECK-NEXT: }; +// CHECK-EMPTY: // CHECK-NEXT: const RTLIB::Libcall llvm::RTLIB::RuntimeLibcallsInfo::ImplToLibcall[RTLIB::NumLibcallImpls] = { // CHECK-NEXT: RTLIB::UNKNOWN_LIBCALL, // RTLIB::Unsupported // CHECK-NEXT: RTLIB::MEMCPY, // RTLIB::___memcpy @@ -162,11 +174,11 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi // CHECK-NEXT: } // CHECK: iota_range<RTLIB::LibcallImpl> RTLIB::RuntimeLibcallsInfo::lookupLibcallImplNameImpl(StringRef Name) { -// CHECK: static constexpr std::pair<uint16_t, uint16_t> HashTableNameToEnum[16] = { -// CHECK: {2, 9}, // 0x000000705301b8, ___memset -// CHECK: {0, 0}, -// CHECK: {6, 6}, // 0x0000001417a2af, calloc -// CHECK: {0, 0}, +// CHECK: static constexpr uint16_t HashTableNameToEnum[16] = { +// CHECK: 2, // 0x000000705301b8, ___memset +// CHECK: 0, +// CHECK: 6, // 0x0000001417a2af, calloc +// CHECK: 0, // CHECK: }; // CHECK: unsigned Idx = (hash(Name) % 8) * 2; diff --git a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp index 775cef22db0b6..1c5f38d0c24b8 100644 --- a/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp +++ b/llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp @@ -461,15 +461,13 @@ void RuntimeLibcallEmitter::emitNameMatchHashTable( // Emit pair of RTLIB::LibcallImpl, size of the string name. It's important to // avoid strlen on the string table entries. - OS << " static constexpr std::pair<uint16_t, uint16_t> HashTableNameToEnum[" - << Lookup.size() << "] = {\n"; + OS << " static constexpr uint16_t HashTableNameToEnum[" << Lookup.size() + << "] = {\n"; for (auto [FuncName, Hash, TableVal] : Lookup) { - OS << " {" << TableVal << ", " << FuncName.size() << "},"; - - if (TableVal != 0) { + OS << " " << TableVal << ','; + if (TableVal != 0) OS << " // " << format_hex(Hash, 16) << ", " << FuncName; - } OS << '\n'; } @@ -480,11 +478,12 @@ void RuntimeLibcallEmitter::emitNameMatchHashTable( << ";\n\n" " for (int I = 0; I != " << Collisions << R"(; ++I) { - auto [Entry, StringSize] = HashTableNameToEnum[Idx + I]; + const uint16_t Entry = HashTableNameToEnum[Idx + I]; const uint16_t StrOffset = RuntimeLibcallNameOffsetTable[Entry]; + const uint8_t StrSize = RuntimeLibcallNameSizeTable[Entry]; StringRef Str( &RTLIB::RuntimeLibcallsInfo::RuntimeLibcallImplNameTableStorage[StrOffset], - StringSize); + StrSize); if (Str == Name) return libcallImplNameHit(Entry, StrOffset); } @@ -520,6 +519,15 @@ const uint16_t RTLIB::RuntimeLibcallsInfo::RuntimeLibcallNameOffsetTable[] = { } OS << "};\n"; + OS << R"( +const uint8_t RTLIB::RuntimeLibcallsInfo::RuntimeLibcallNameSizeTable[] = { +)"; + + OS << " 0,\n"; + for (const RuntimeLibcallImpl &LibCallImpl : RuntimeLibcallImplDefList) + OS << " " << LibCallImpl.getLibcallFuncName().size() << ",\n"; + OS << "};\n\n"; + // Emit the reverse mapping from implementation libraries to RTLIB::Libcall OS << "const RTLIB::Libcall llvm::RTLIB::RuntimeLibcallsInfo::" "ImplToLibcall[RTLIB::NumLibcallImpls] = {\n" _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits