about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-03-18 11:03:49 +0000
committerbors <bors@rust-lang.org>2021-03-18 11:03:49 +0000
commit0464f638af99a7c0876e9b8f96db5bbf917e3fe2 (patch)
tree89a7a6b48e1038e4eba84d806ea1684c15e02412 /src
parent895a8e71b1a9fc42631f81b071bc855f7fb3e9a4 (diff)
parent81c9a0201869009e7a443d5bd0a00c5134ba8a41 (diff)
downloadrust-0464f638af99a7c0876e9b8f96db5bbf917e3fe2.tar.gz
rust-0464f638af99a7c0876e9b8f96db5bbf917e3fe2.zip
Auto merge of #77566 - Marwes:smaller_hashmap, r=Amanieu
feat: Update hashbrown to instantiate less llvm IR

Includes https://github.com/rust-lang/hashbrown/pull/204 and https://github.com/rust-lang/hashbrown/pull/205 (not yet merged) which both serve to reduce the amount of IR generated for hashmaps.

Inspired by the llvm-lines data gathered in https://github.com/rust-lang/rust/pull/76680 (cc `@Julian-Wollersberger)`
Diffstat (limited to 'src')
-rw-r--r--src/etc/gdb_providers.py11
-rw-r--r--src/etc/lldb_providers.py2
-rw-r--r--src/etc/natvis/libstd.natvis28
3 files changed, 21 insertions, 20 deletions
diff --git a/src/etc/gdb_providers.py b/src/etc/gdb_providers.py
index 2d902a9b6e0..f0ce13b269c 100644
--- a/src/etc/gdb_providers.py
+++ b/src/etc/gdb_providers.py
@@ -349,17 +349,18 @@ class StdHashMapProvider:
         self.show_values = show_values
 
         table = self.table()
-        capacity = int(table["bucket_mask"]) + 1
-        ctrl = table["ctrl"]["pointer"]
+        table_inner = table["table"]
+        capacity = int(table_inner["bucket_mask"]) + 1
+        ctrl = table_inner["ctrl"]["pointer"]
 
-        self.size = int(table["items"])
+        self.size = int(table_inner["items"])
         self.pair_type = table.type.template_argument(0).strip_typedefs()
 
-        self.new_layout = not table.type.has_key("data")
+        self.new_layout = not table_inner.type.has_key("data")
         if self.new_layout:
             self.data_ptr = ctrl.cast(self.pair_type.pointer())
         else:
-            self.data_ptr = table["data"]["pointer"]
+            self.data_ptr = table_inner["data"]["pointer"]
 
         self.valid_indices = []
         for idx in range(capacity):
diff --git a/src/etc/lldb_providers.py b/src/etc/lldb_providers.py
index ca2685ca31f..702f2e82e4e 100644
--- a/src/etc/lldb_providers.py
+++ b/src/etc/lldb_providers.py
@@ -563,7 +563,7 @@ class StdHashMapSyntheticProvider:
             # HashSet wraps either std HashMap or hashbrown::HashSet, which both
             # wrap hashbrown::HashMap, so either way we "unwrap" twice.
             hashbrown_hashmap = self.valobj.GetChildAtIndex(0).GetChildAtIndex(0)
-        return hashbrown_hashmap.GetChildMemberWithName("table")
+        return hashbrown_hashmap.GetChildMemberWithName("table").GetChildMemberWithName("table")
 
     def has_children(self):
         # type: () -> bool
diff --git a/src/etc/natvis/libstd.natvis b/src/etc/natvis/libstd.natvis
index b0542b0c633..2c05f9d7c12 100644
--- a/src/etc/natvis/libstd.natvis
+++ b/src/etc/natvis/libstd.natvis
@@ -26,22 +26,22 @@
   -->
 
   <Type Name="std::collections::hash::map::HashMap&lt;*,*,*&gt;">
-    <DisplayString>{{ len={base.table.items} }}</DisplayString>
+    <DisplayString>{{ len={base.table.table.items} }}</DisplayString>
     <Expand>
-      <Item Name="[len]">base.table.items</Item>
-      <Item Name="[capacity]">base.table.items + base.table.growth_left</Item>
+      <Item Name="[len]">base.table.table.items</Item>
+      <Item Name="[capacity]">base.table.table.items + base.table.table.growth_left</Item>
       <Item Name="[state]">base.hash_builder</Item>
 
       <CustomListItems>
         <Variable Name="i" InitialValue="0" />
-        <Variable Name="n" InitialValue="base.table.items" />
-        <Size>base.table.items</Size>
+        <Variable Name="n" InitialValue="base.table.table.items" />
+        <Size>base.table.table.items</Size>
         <Loop>
           <Break Condition="n == 0" />
-          <If Condition="(base.table.ctrl.pointer[i] &amp; 0x80) == 0">
+          <If Condition="(base.table.table.ctrl.pointer[i] &amp; 0x80) == 0">
             <!-- Bucket is populated -->
             <Exec>n--</Exec>
-            <Item Name="{((tuple&lt;$T1, $T2&gt;*)base.table.ctrl.pointer)[-(i + 1)].__0}">((tuple&lt;$T1, $T2&gt;*)base.table.ctrl.pointer)[-(i + 1)].__1</Item>
+            <Item Name="{((tuple&lt;$T1, $T2&gt;*)base.table.table.ctrl.pointer)[-(i + 1)].__0}">((tuple&lt;$T1, $T2&gt;*)base.table.table.ctrl.pointer)[-(i + 1)].__1</Item>
           </If>
           <Exec>i++</Exec>
         </Loop>
@@ -50,22 +50,22 @@
   </Type>
 
   <Type Name="std::collections::hash::set::HashSet&lt;*,*&gt;">
-    <DisplayString>{{ len={base.map.table.items} }}</DisplayString>
+    <DisplayString>{{ len={base.map.table.table.items} }}</DisplayString>
     <Expand>
-      <Item Name="[len]">base.map.table.items</Item>
-      <Item Name="[capacity]">base.map.table.items + base.map.table.growth_left</Item>
+      <Item Name="[len]">base.map.table.table.items</Item>
+      <Item Name="[capacity]">base.map.table.table.items + base.map.table.table.growth_left</Item>
       <Item Name="[state]">base.map.hash_builder</Item>
 
       <CustomListItems>
         <Variable Name="i" InitialValue="0" />
-        <Variable Name="n" InitialValue="base.map.table.items" />
-        <Size>base.map.table.items</Size>
+        <Variable Name="n" InitialValue="base.map.table.table.items" />
+        <Size>base.map.table.table.items</Size>
         <Loop>
           <Break Condition="n == 0" />
-          <If Condition="(base.map.table.ctrl.pointer[i] &amp; 0x80) == 0">
+          <If Condition="(base.map.table.table.ctrl.pointer[i] &amp; 0x80) == 0">
             <!-- Bucket is populated -->
             <Exec>n--</Exec>
-            <Item>(($T1*)base.map.table.ctrl.pointer)[-(i + 1)]</Item>
+            <Item>(($T1*)base.map.table.table.ctrl.pointer)[-(i + 1)]</Item>
           </If>
           <Exec>i++</Exec>
         </Loop>