diff --git a/clwb/src/META-INF/clwb.xml b/clwb/src/META-INF/clwb.xml
index 9782a007564..8d84ef90e4c 100644
--- a/clwb/src/META-INF/clwb.xml
+++ b/clwb/src/META-INF/clwb.xml
@@ -33,6 +33,7 @@
+
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java
index 3429fd59d15..2ce3cc1841f 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java
@@ -44,6 +44,10 @@
import com.intellij.util.PathUtil;
import com.jetbrains.cidr.execution.CidrCommandLineState;
+import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder;
+import com.jetbrains.cidr.lang.workspace.compiler.ClangClCompilerKind;
+import com.jetbrains.cidr.lang.workspace.compiler.ClangCompilerKind;
+import com.jetbrains.cidr.lang.workspace.compiler.MSVCCompilerKind;
import javax.annotation.Nullable;
import java.io.File;
import java.util.List;
@@ -110,22 +114,39 @@ private ImmutableList getExtraDebugFlags(ExecutionEnvironment env) {
}
final var flagsBuilder = ImmutableList.builder();
-
- if (debuggerKind == BlazeDebuggerKind.BUNDLED_LLDB && !Registry.is("bazel.trim.absolute.path.disabled")) {
- flagsBuilder.add("--copt=-fdebug-compilation-dir=" + WorkspaceRoot.fromProject(env.getProject()));
-
- if (SystemInfo.isMac) {
- flagsBuilder.add("--linkopt=-Wl,-oso_prefix,.");
- }
+ if (Registry.is("bazel.clwb.debug.enforce.dbg.compilation.mode")) {
+ flagsBuilder.add("--compilation_mode=dbg");
+ flagsBuilder.add("--strip=never");
+ flagsBuilder.add("--dynamic_mode=off");
}
- flagsBuilder.add("--compilation_mode=dbg");
- flagsBuilder.add("--copt=-O0");
- flagsBuilder.add("--copt=-g");
- flagsBuilder.add("--strip=never");
- flagsBuilder.add("--dynamic_mode=off");
- flagsBuilder.addAll(BlazeGDBServerProvider.getOptionalFissionArguments());
+ var compilerKind = RunConfigurationUtils.getCompilerKind(configuration);
+ if (compilerKind == ClangClCompilerKind.INSTANCE || compilerKind == MSVCCompilerKind.INSTANCE) {
+ var sb = new CidrSwitchBuilder();
+ var sb2 = compilerKind.getSwitchBuilder(sb);
+ sb2
+ .withDebugInfo(-1) // ignored for msvc/clangcl
+ .withDisableOptimization();
+
+ sb2.buildRaw().forEach((opt) -> {
+ flagsBuilder.add("--copt=" + opt);
+ });
+
+ } else {
+ if (debuggerKind == BlazeDebuggerKind.BUNDLED_LLDB && !Registry.is(
+ "bazel.trim.absolute.path.disabled")) {
+ flagsBuilder.add(
+ "--copt=-fdebug-compilation-dir=" + WorkspaceRoot.fromProject(env.getProject()));
+
+ if (SystemInfo.isMac) {
+ flagsBuilder.add("--linkopt=-Wl,-oso_prefix,.");
+ }
+ }
+ flagsBuilder.add("--copt=-O0");
+ flagsBuilder.add("--copt=-g");
+ flagsBuilder.addAll(BlazeGDBServerProvider.getOptionalFissionArguments());
+ }
return flagsBuilder.build();
}
diff --git a/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java b/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java
index 8051c1e7403..d2841043553 100644
--- a/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java
+++ b/clwb/tests/headlesstests/com/google/idea/blaze/clwb/ExecutionTest.java
@@ -3,6 +3,7 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.idea.blaze.base.run.producers.BlazeBuildFileRunConfigurationProducer;
+import com.google.idea.blaze.clwb.base.AllowedVfsRoot;
import com.google.idea.blaze.clwb.base.ClwbHeadlessTestCase;
import com.google.idea.blaze.common.Label;
import com.intellij.execution.ExecutionListener;
@@ -12,6 +13,7 @@
import com.intellij.execution.PsiLocation;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.actions.RunConfigurationProducer;
+import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.executors.DefaultRunExecutor;
import com.intellij.execution.impl.ExecutionManagerImpl;
import com.intellij.execution.process.ProcessHandler;
@@ -22,7 +24,10 @@
import com.intellij.openapi.actionSystem.PlatformCoreDataKeys;
import com.intellij.openapi.actionSystem.impl.SimpleDataContext;
import com.intellij.openapi.module.ModuleUtilCore;
+import com.intellij.openapi.util.SystemInfo;
import com.intellij.testFramework.PlatformTestUtil;
+import com.intellij.util.system.OS;
+import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import org.jetbrains.annotations.NotNull;
@@ -33,12 +38,30 @@
@RunWith(JUnit4.class)
public class ExecutionTest extends ClwbHeadlessTestCase {
+ @Override
+ protected void addAllowedVfsRoots(ArrayList roots) {
+ super.addAllowedVfsRoots(roots);
+
+ // use flat?
+ String path;
+ if (SystemInfo.isWindows) {
+ path = "main/hello-world.exe";
+ } else {
+ path = "main/hello-world";
+ }
+
+ var fastBuildRoot = AllowedVfsRoot.bazelBinRecursive(myBazelInfo, path);
+ var debugBuildRoot = AllowedVfsRoot.recursive(fastBuildRoot.toString().replace("fastbuild", "dbg"));
+ roots.add(debugBuildRoot);
+ }
+
@Test
public void testClwb() throws Exception {
final var errors = runSync(defaultSyncParams().build());
errors.assertNoErrors();
checkRun();
+ checkDebug();
checkTest();
}
@@ -47,6 +70,11 @@ private void checkRun() throws Exception {
assertThat(result).isEqualTo(0);
}
+ private void checkDebug() throws Exception {
+ final var result = execute(Label.of("//main:hello-world"), DefaultDebugExecutor.EXECUTOR_ID);
+ assertThat(result).isEqualTo(0);
+ }
+
private void checkTest() throws Exception {
final var result = execute(Label.of("//main:test"), DefaultRunExecutor.EXECUTOR_ID);
assertThat(result).isEqualTo(0);
@@ -61,7 +89,7 @@ private int execute(Label label, String executorId) throws Exception {
.add(Location.DATA_KEY, PsiLocation.fromPsiElement(element))
.build(), ActionPlaces.UNKNOWN);
- final var executor = ExecutorRegistry.getInstance().getExecutorById(DefaultRunExecutor.EXECUTOR_ID);
+ final var executor = ExecutorRegistry.getInstance().getExecutorById(executorId);
assertThat(executor).isNotNull();
final var producer = RunConfigurationProducer.getInstance(BlazeBuildFileRunConfigurationProducer.class);