https://github.com/royitaqi updated 
https://github.com/llvm/llvm-project/pull/153536

>From a8b0d3ebb8e3b5519ecda14699346123781abc2b Mon Sep 17 00:00:00 2001
From: Roy Shi <roy...@meta.com>
Date: Wed, 13 Aug 2025 22:47:58 -0700
Subject: [PATCH 1/2] [vscode-lldb] Support lldb-dap environment in debug
 configuration

---
 lldb/tools/lldb-dap/package.json              |  9 ++++
 .../lldb-dap/src-ts/debug-adapter-factory.ts  | 42 ++++++++++++++++++-
 lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts | 26 ++++++++++--
 3 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index d677a81cc7974..3e6928cf4327f 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -370,6 +370,15 @@
                 },
                 "markdownDescription": "The list of additional arguments used 
to launch the debug adapter executable. Overrides any user or workspace 
settings."
               },
+              "debugAdapterEnv": {
+                "type": "object",
+                "patternProperties": {
+                  ".*": {
+                    "type": "string"
+                  }
+                },
+                "markdownDescription": "Additional environment variables to 
set when launching the debug adapter executable. E.g. `{ \"FOO\": \"1\" }`"
+              },
               "program": {
                 "type": "string",
                 "description": "Path to the program to debug."
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts 
b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index 157aa2ac76a1f..e7bdd835894c0 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -157,6 +157,42 @@ async function getDAPArguments(
     .get<string[]>("arguments", []);
 }
 
+/**
+ * Retrieves the environment that will be provided to lldb-dap either from 
settings or the provided
+ * {@link vscode.DebugConfiguration}.
+ *
+ * @param workspaceFolder The {@link vscode.WorkspaceFolder} that the debug 
session will be launched within
+ * @param configuration The {@link vscode.DebugConfiguration} that will be 
launched
+ * @throws An {@link ErrorWithNotification} if something went wrong
+ * @returns The environment that will be provided to lldb-dap
+ */
+async function getDAPEnvironment(
+  workspaceFolder: vscode.WorkspaceFolder | undefined,
+  configuration: vscode.DebugConfiguration,
+): Promise<string[]> {
+  const debugConfigEnv = configuration.debugAdapterEnv;
+  if (debugConfigEnv) {
+    if (
+      Array.isArray(debugConfigEnv) ||
+      typeof debugConfigEnv !== "object" ||
+      Object.values(debugConfigEnv).findIndex(
+        (entry) => typeof entry !== "string",
+      ) !== -1
+    ) {
+      throw new ErrorWithNotification(
+        "The debugAdapterEnv property must be a dictionary with string values. 
Please update your launch configuration",
+        new ConfigureButton(),
+      );
+    }
+    return debugConfigEnv;
+  }
+
+  const config = vscode.workspace.workspaceFile
+    ? vscode.workspace.getConfiguration("lldb-dap")
+    : vscode.workspace.getConfiguration("lldb-dap", workspaceFolder);
+  return config.get<{ [key: string]: string }>("environment") || {};
+}
+
 /**
  * Creates a new {@link vscode.DebugAdapterExecutable} based on the provided 
workspace folder and
  * debug configuration. Assumes that the given debug configuration is for a 
local launch of lldb-dap.
@@ -186,8 +222,10 @@ export async function createDebugAdapterExecutable(
   ) {
     env["LLDBDAP_LOG"] = logFilePath.get(LogType.DEBUG_SESSION);
   }
-  const configEnvironment =
-    config.get<{ [key: string]: string }>("environment") || {};
+  const configEnvironment = await getDAPEnvironment(
+    workspaceFolder,
+    configuration,
+  );
   const dapPath = await getDAPExecutable(workspaceFolder, configuration);
 
   const dbgOptions = {
diff --git a/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts 
b/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts
index 5f9d8efdcb3a3..7d37c695c5a0a 100644
--- a/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts
+++ b/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts
@@ -11,6 +11,7 @@ import * as vscode from "vscode";
 export class LLDBDapServer implements vscode.Disposable {
   private serverProcess?: child_process.ChildProcessWithoutNullStreams;
   private serverInfo?: Promise<{ host: string; port: number }>;
+  private serverSpawnInfo?: string[];
 
   constructor() {
     vscode.commands.registerCommand(
@@ -34,7 +35,7 @@ export class LLDBDapServer implements vscode.Disposable {
     options?: child_process.SpawnOptionsWithoutStdio,
   ): Promise<{ host: string; port: number } | undefined> {
     const dapArgs = [...args, "--connection", "listen://localhost:0"];
-    if (!(await this.shouldContinueStartup(dapPath, dapArgs))) {
+    if (!(await this.shouldContinueStartup(dapPath, dapArgs, options?.env))) {
       return undefined;
     }
 
@@ -70,6 +71,7 @@ export class LLDBDapServer implements vscode.Disposable {
         }
       });
       this.serverProcess = process;
+      this.serverSpawnInfo = this.getSpawnInfo(dapPath, dapArgs, options?.env);
     });
     return this.serverInfo;
   }
@@ -85,12 +87,14 @@ export class LLDBDapServer implements vscode.Disposable {
   private async shouldContinueStartup(
     dapPath: string,
     args: string[],
+    env: NodeJS.ProcessEnv | { [key: string]: string } | undefined,
   ): Promise<boolean> {
     if (!this.serverProcess || !this.serverInfo) {
       return true;
     }
 
-    if (isDeepStrictEqual(this.serverProcess.spawnargs, [dapPath, ...args])) {
+    const newSpawnInfo = this.getSpawnInfo(dapPath, args, env);
+    if (isDeepStrictEqual(this.serverSpawnInfo, newSpawnInfo)) {
       return true;
     }
 
@@ -102,11 +106,11 @@ export class LLDBDapServer implements vscode.Disposable {
 
 The previous lldb-dap server was started with:
 
-${this.serverProcess.spawnargs.join(" ")}
+${this.serverSpawnInfo.join(" ")}
 
 The new lldb-dap server will be started with:
 
-${dapPath} ${args.join(" ")}
+${newSpawnInfo.join(" ")}
 
 Restarting the server will interrupt any existing debug sessions and start a 
new server.`,
       },
@@ -143,4 +147,18 @@ Restarting the server will interrupt any existing debug 
sessions and start a new
       this.serverInfo = undefined;
     }
   }
+
+  getSpawnInfo(
+    path: string,
+    args: string[],
+    env: NodeJS.ProcessEnv | { [key: string]: string } | undefined,
+  ): string[] {
+    return [
+      path,
+      ...args,
+      ...Object.entries(env ?? {}).map(
+        (entry) => String(entry[0]) + "=" + String(entry[1]),
+      ),
+    ];
+  }
 }

>From f4678f26a7a756682edad7cd85100f59c1823f0a Mon Sep 17 00:00:00 2001
From: Roy Shi <roy...@meta.com>
Date: Thu, 14 Aug 2025 07:52:09 -0700
Subject: [PATCH 2/2] Support array format

---
 lldb/tools/lldb-dap/package.json              | 26 ++++++++++----
 .../lldb-dap/src-ts/debug-adapter-factory.ts  | 35 ++++++++++++++-----
 2 files changed, 47 insertions(+), 14 deletions(-)

diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index 3e6928cf4327f..63ea1620d16f5 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -371,13 +371,27 @@
                 "markdownDescription": "The list of additional arguments used 
to launch the debug adapter executable. Overrides any user or workspace 
settings."
               },
               "debugAdapterEnv": {
-                "type": "object",
-                "patternProperties": {
-                  ".*": {
-                    "type": "string"
+                "anyOf": [
+                  {
+                    "type": "object",
+                    "markdownDescription": "Additional environment variables 
to set when launching the debug adapter executable. E.g. `{ \"FOO\": \"1\" }`",
+                    "patternProperties": {
+                      ".*": {
+                        "type": "string"
+                      }
+                    },
+                    "default": {}
+                  },
+                  {
+                    "type": "array",
+                    "markdownDescription": "Additional environment variables 
to set when launching the debug adapter executable. E.g. `[\"FOO=1\", 
\"BAR\"]`",
+                    "items": {
+                      "type": "string",
+                      "pattern": "^((\\w+=.*)|^\\w+)$"
+                    },
+                    "default": []
                   }
-                },
-                "markdownDescription": "Additional environment variables to 
set when launching the debug adapter executable. E.g. `{ \"FOO\": \"1\" }`"
+                ]
               },
               "program": {
                 "type": "string",
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts 
b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index e7bdd835894c0..107771f7e5ccc 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -169,22 +169,41 @@ async function getDAPArguments(
 async function getDAPEnvironment(
   workspaceFolder: vscode.WorkspaceFolder | undefined,
   configuration: vscode.DebugConfiguration,
-): Promise<string[]> {
+): Promise<{ [key: string]: string }> {
   const debugConfigEnv = configuration.debugAdapterEnv;
   if (debugConfigEnv) {
     if (
-      Array.isArray(debugConfigEnv) ||
-      typeof debugConfigEnv !== "object" ||
-      Object.values(debugConfigEnv).findIndex(
-        (entry) => typeof entry !== "string",
-      ) !== -1
+      (typeof debugConfigEnv !== "object" ||
+
+        Object.values(debugConfigEnv).findIndex(
+          (entry) => typeof entry !== "string",
+        ) !== -1) &&
+      (!Array.isArray(debugConfigEnv) ||
+        debugConfigEnv.findIndex(
+          (entry) =>
+            typeof entry !== "string" || !/^((\\w+=.*)|^\\w+)$/.test(entry),
+        ) !== -1)
     ) {
       throw new ErrorWithNotification(
-        "The debugAdapterEnv property must be a dictionary with string values. 
Please update your launch configuration",
+        "The debugAdapterEnv property must be a dictionary of string keys and 
values OR an array of string values. Please update your launch configuration",
         new ConfigureButton(),
       );
     }
-    return debugConfigEnv;
+    // Transform, so that the returned value is always a dictionary.
+    if (Array.isArray(debugConfigEnv)) {
+      const ret: { [key: string]: string } = {};
+      for (const envVar of debugConfigEnv as string[]) {
+        const equalSignPos = envVar.search("=");
+        if (equalSignPos >= 0) {
+          ret[envVar.substr(0, equalSignPos)] = envVar.substr(equalSignPos + 
1);
+        } else {
+          ret[envVar] = "";
+        }
+      }
+      return ret;
+    } else {
+      return debugConfigEnv;
+    }
   }
 
   const config = vscode.workspace.workspaceFile

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to