[clang] [clang][Driver] Ensure intermediate bitcode files are written according to `/Fo` (PR #189977)

via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 2 00:45:24 PDT 2026


================
@@ -6629,6 +6629,12 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
             ->getValue();
     NamedOutput =
         MakeCLOutputFilename(C.getArgs(), Val, BaseName, types::TY_Object);
+  } else if ((JA.getType() == types::TY_LLVM_BC ||
----------------
rthomas-activision wrote:

Yes, we initially tried adding this condition next to `TY_LTO_BC` (line 6577)
but here is why I changed to an isolated condition.

In my understanding, the block under `JA.getType() == types::TY_Object || JA.getType() == types::TY_LTO_BC)` is aiming 
for the final object file that is written under the filename `MakeCLOutputFilename(..., types::TY_Object);`:

```
$ clang-cl /c /Fomain       # -> main.obj # types::TY_Object 
$ clang-cl /c /Fomain -flto # -> main.obj # types::TY_LTO_BC
```

In our case, the generated `main.bc` is the result of an **intermediate** step that
is not used by the linker (compared to `TY_LTO_BC`).

By using `-###` to exapnd the two steps:

```
$ clang-cl /c /Fomain /clang:-fembed-bitcode -### -- ./src/main.cpp
"../bin/clang-23" "-cc1" "-emit-llvm-bc" "-emit-llvm-uselists" "-main-file-name" "main.cpp" [...] "-o" "main.bc" "-x" "c++" "./src/main.cpp" # Step 1
"../bin/clang-23" "-cc1" "-emit-obj" "-fembed-bitcode=all" "-fembed-bitcode=all" "-disable-llvm-passes" "-o" "main.obj" "-x" "ir" "main.bc"  # Step 2
```

If we appended `|| JA.getType() == types::TY_LLVM_BC` to the line you mentioned, 
Step 1 would write to `main.obj` instead of `main.bc`. 
This happens because `MakeCLOutputFilename` is called with `types::TY_Object` as its third parameter, 
which forces the `.obj` extension.

I isolated the condition to prevent this intermediate file from causing a naming 
collision with the final output file.




https://github.com/llvm/llvm-project/pull/189977


More information about the cfe-commits mailing list