Add native options for cc_shared_library rule.

PiperOrigin-RevId: 393094082
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
index 1e8ce65..2f59265 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java
@@ -457,6 +457,18 @@
     return cppOptions.cppCompiler;
   }
 
+  public boolean experimentalLinkStaticLibrariesOnce() {
+    return cppOptions.experimentalLinkStaticLibrariesOnce;
+  }
+
+  public boolean experimentalEnableTargetExportCheck() {
+    return cppOptions.experimentalEnableTargetExportCheck;
+  }
+
+  public boolean experimentalCcSharedLibraryDebug() {
+    return cppOptions.experimentalCcSharedLibraryDebug;
+  }
+
   public boolean legacyWholeArchive() {
     return cppOptions.legacyWholeArchive;
   }
@@ -862,6 +874,26 @@
     return fissionIsActiveForCurrentCompilationMode();
   }
 
+  @Override
+  public boolean getExperimentalLinkStaticLibrariesOnce(StarlarkThread thread)
+      throws EvalException {
+    CcModule.checkPrivateStarlarkificationAllowlist(thread);
+    return experimentalLinkStaticLibrariesOnce();
+  }
+
+  @Override
+  public boolean getExperimentalEnableTargetExportCheck(StarlarkThread thread)
+      throws EvalException {
+    CcModule.checkPrivateStarlarkificationAllowlist(thread);
+    return experimentalEnableTargetExportCheck();
+  }
+
+  @Override
+  public boolean getExperimentalCcSharedLibraryDebug(StarlarkThread thread) throws EvalException {
+    CcModule.checkPrivateStarlarkificationAllowlist(thread);
+    return experimentalCcSharedLibraryDebug();
+  }
+
   /**
    * Returns the bitcode mode to use for compilation.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
index ddf14eb..53c1905 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppOptions.java
@@ -1091,6 +1091,47 @@
       help = "If enabled, cc_library targets can use attribute `implementation_deps`.")
   public boolean experimentalCcImplementationDeps;
 
+  @Option(
+      name = "experimental_link_static_libraries_once",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+      effectTags = {
+        OptionEffectTag.LOADING_AND_ANALYSIS,
+      },
+      metadataTags = {
+        OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES,
+        OptionMetadataTag.INCOMPATIBLE_CHANGE,
+        OptionMetadataTag.EXPERIMENTAL,
+      },
+      help =
+          "If enabled, cc_shared_library will link all libraries statically linked into it, that"
+              + " should only be linked once.")
+  public boolean experimentalLinkStaticLibrariesOnce;
+
+  @Option(
+      name = "experimental_enable_target_export_check",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+      effectTags = {
+        OptionEffectTag.LOADING_AND_ANALYSIS,
+      },
+      metadataTags = {OptionMetadataTag.EXPERIMENTAL},
+      help =
+          "If enabled, cc_shared_library will export targets which is allowed by its `permissions`"
+              + " attribute.")
+  public boolean experimentalEnableTargetExportCheck;
+
+  @Option(
+      name = "experimental_cc_shared_library_debug",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+      effectTags = {
+        OptionEffectTag.LOADING_AND_ANALYSIS,
+      },
+      metadataTags = {OptionMetadataTag.EXPERIMENTAL},
+      help = "If enabled, will create debug files associated with cc_shared_library.")
+  public boolean experimentalCcSharedLibraryDebug;
+
   /** See {@link #targetLibcTopLabel} documentation. * */
   @Override
   public FragmentOptions getNormalized() {
@@ -1140,6 +1181,10 @@
       coptListBuilder.add("-g0");
       cxxoptListBuilder.add("-g0");
     }
+    host.experimentalLinkStaticLibrariesOnce = experimentalLinkStaticLibrariesOnce;
+    host.experimentalEnableTargetExportCheck = experimentalEnableTargetExportCheck;
+    host.experimentalCcSharedLibraryDebug = experimentalCcSharedLibraryDebug;
+
     host.coptList = coptListBuilder.addAll(hostCoptList).build();
     host.cxxoptList = cxxoptListBuilder.addAll(hostCxxoptList).build();
     host.conlyoptList = ImmutableList.copyOf(hostConlyoptList);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java
index 669c438..fbfc37a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CppConfigurationApi.java
@@ -33,6 +33,24 @@
     extends StarlarkValue {
 
   @StarlarkMethod(
+      name = "experimental_link_static_libraries_once",
+      documented = false,
+      useStarlarkThread = true)
+  boolean getExperimentalLinkStaticLibrariesOnce(StarlarkThread thread) throws EvalException;
+
+  @StarlarkMethod(
+      name = "experimental_enable_target_export_check",
+      documented = false,
+      useStarlarkThread = true)
+  boolean getExperimentalEnableTargetExportCheck(StarlarkThread thread) throws EvalException;
+
+  @StarlarkMethod(
+      name = "experimental_cc_shared_library_debug",
+      documented = false,
+      useStarlarkThread = true)
+  boolean getExperimentalCcSharedLibraryDebug(StarlarkThread thread) throws EvalException;
+
+  @StarlarkMethod(
       name = "copts",
       structField = true,
       doc =