Add C++ symbol visibility annotations for Rust functions and impls
diff --git a/gen/src/write.rs b/gen/src/write.rs
index b0af714..7a910f1 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -950,6 +950,9 @@
         // We've already defined this inside the struct.
         return;
     }
+    if !out.header {
+        begin_function_definition(out);
+    }
     write_rust_function_shim_decl(out, local_name, sig, indirect_call);
     if out.header {
         writeln!(out, ";");
@@ -1487,6 +1490,7 @@
     let instance = ident.to_symbol();
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(
         out,
         "{} *Box<{}>::allocation::alloc() noexcept {{",
@@ -1496,6 +1500,7 @@
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(
         out,
         "void Box<{}>::allocation::dealloc({} *ptr) noexcept {{",
@@ -1505,6 +1510,7 @@
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(out, "void Box<{}>::drop() noexcept {{", inner);
     writeln!(out, "  cxxbridge1$box${}$drop(this);", instance);
     writeln!(out, "}}");
@@ -1517,16 +1523,19 @@
     out.include.cstddef = true;
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(out, "Vec<{}>::Vec() noexcept {{", inner);
     writeln!(out, "  cxxbridge1$rust_vec${}$new(this);", instance);
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(out, "void Vec<{}>::drop() noexcept {{", inner);
     writeln!(out, "  return cxxbridge1$rust_vec${}$drop(this);", instance);
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(
         out,
         "::std::size_t Vec<{}>::size() const noexcept {{",
@@ -1536,6 +1545,7 @@
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(
         out,
         "::std::size_t Vec<{}>::capacity() const noexcept {{",
@@ -1549,11 +1559,13 @@
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(out, "const {} *Vec<{0}>::data() const noexcept {{", inner);
     writeln!(out, "  return cxxbridge1$rust_vec${}$data(this);", instance);
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(
         out,
         "void Vec<{}>::reserve_total(::std::size_t cap) noexcept {{",
@@ -1567,6 +1579,7 @@
     writeln!(out, "}}");
 
     writeln!(out, "template <>");
+    begin_function_definition(out);
     writeln!(
         out,
         "void Vec<{}>::set_len(::std::size_t len) noexcept {{",