llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Timm Baeder (tbaederr)

<details>
<summary>Changes</summary>

Instead of a typedef. Save offsets and infos separately to speed up the binary 
search a bit.

---
Full diff: https://github.com/llvm/llvm-project/pull/215760.diff


3 Files Affected:

- (modified) clang/lib/AST/ByteCode/ByteCodeEmitter.cpp (+2-2) 
- (modified) clang/lib/AST/ByteCode/Function.cpp (+1-5) 
- (modified) clang/lib/AST/ByteCode/Source.h (+25-1) 


``````````diff
diff --git a/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp 
b/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp
index 0a8a766ed8a4e..9a2c1c2b496b0 100644
--- a/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp
+++ b/clang/lib/AST/ByteCode/ByteCodeEmitter.cpp
@@ -213,9 +213,9 @@ bool ByteCodeEmitter::emitOp(Opcode Op, const Tys &...Args, 
SourceInfo SI) {
   // attached to the address after the opcode.
   emit(P, Code, Op, Success);
   if (LocOverride)
-    SrcMap.emplace_back(Code.size(), *LocOverride);
+    SrcMap.push(Code.size(), *LocOverride);
   else if (SI)
-    SrcMap.emplace_back(Code.size(), SI);
+    SrcMap.push(Code.size(), SI);
 
   (..., emit(P, Code, Args, Success));
   return Success;
diff --git a/clang/lib/AST/ByteCode/Function.cpp 
b/clang/lib/AST/ByteCode/Function.cpp
index 22d26e498c5b6..49282c9dc7a33 100644
--- a/clang/lib/AST/ByteCode/Function.cpp
+++ b/clang/lib/AST/ByteCode/Function.cpp
@@ -64,9 +64,5 @@ SourceInfo Function::getSource(CodePtr PC) const {
   assert(PC <= getCodeEnd() && "PC Does not belong to this function");
   assert(hasBody() && "Function has no body");
   unsigned Offset = PC - getCodeBegin();
-  using Elem = std::pair<unsigned, SourceInfo>;
-  auto It = llvm::lower_bound(SrcMap, Elem{Offset, {}}, llvm::less_first());
-  if (It == SrcMap.end())
-    return SrcMap.back().second;
-  return It->second;
+  return SrcMap.findSourceForOffset(Offset);
 }
diff --git a/clang/lib/AST/ByteCode/Source.h b/clang/lib/AST/ByteCode/Source.h
index 32bc7856068fe..db935da7c7c49 100644
--- a/clang/lib/AST/ByteCode/Source.h
+++ b/clang/lib/AST/ByteCode/Source.h
@@ -17,6 +17,7 @@
 #include "clang/AST/DeclBase.h"
 #include "clang/AST/Stmt.h"
 #include "llvm/ADT/PointerUnion.h"
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/Endian.h"
 
 namespace clang {
@@ -97,7 +98,30 @@ class SourceInfo final {
 };
 static_assert(sizeof(SourceInfo) == sizeof(void *));
 
-using SourceMap = std::vector<std::pair<unsigned, SourceInfo>>;
+// A map from byte code offset to source information.
+// This is used to get the location in the input source file for diagnostics.
+class SourceMap final {
+private:
+  llvm::SmallVector<uint32_t> Offsets;
+  llvm::SmallVector<SourceInfo> Infos;
+
+public:
+  SourceMap() = default;
+  void push(uint32_t Offset, SourceInfo Info) {
+    Offsets.push_back(Offset);
+    Infos.push_back(Info);
+  }
+
+  SourceInfo findSourceForOffset(uint32_t Offset) const {
+    assert(!Offsets.empty());
+    assert(Offsets.size() == Infos.size());
+#ifndef NDEBUG
+    assert(llvm::is_sorted(Offsets));
+#endif
+    const auto *It = llvm::lower_bound(Offsets, Offset);
+    return Infos[It - Offsets.begin()];
+  }
+};
 
 /// Interface for classes which map locations to sources.
 class SourceMapper {

``````````

</details>


https://github.com/llvm/llvm-project/pull/215760
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to