Skip to content

Commit d1b0b4b

Browse files
authored
Add -funique-source-file-identifier option.
This option complements -funique-source-file-names and allows the user to use a different unique identifier than the source file path. Reviewers: teresajohnson Reviewed By: teresajohnson Pull Request: #142901
1 parent def37f7 commit d1b0b4b

File tree

10 files changed

+60
-28
lines changed

10 files changed

+60
-28
lines changed

clang/docs/UsersManual.rst

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,12 +2300,14 @@ are listed below.
23002300
.. option:: -f[no-]unique-source-file-names
23012301

23022302
When enabled, allows the compiler to assume that each object file
2303-
passed to the linker has been compiled using a unique source file
2304-
path. This is useful for reducing link times when doing ThinLTO
2305-
in combination with whole-program devirtualization or CFI.
2303+
passed to the linker has a unique identifier. The identifier for
2304+
an object file is either the source file path or the value of the
2305+
argument `-funique-source-file-identifier` if specified. This is
2306+
useful for reducing link times when doing ThinLTO in combination with
2307+
whole-program devirtualization or CFI.
23062308

2307-
The full source path passed to the compiler must be unique. This
2308-
means that, for example, the following is a usage error:
2309+
The full source path or identifier passed to the compiler must be
2310+
unique. This means that, for example, the following is a usage error:
23092311

23102312
.. code-block:: console
23112313
@@ -2327,6 +2329,11 @@ are listed below.
23272329
A misuse of this flag may result in a duplicate symbol error at
23282330
link time.
23292331

2332+
.. option:: -funique-source-file-identifier=IDENTIFIER
2333+
2334+
Used with `-funique-source-file-names` to specify a source file
2335+
identifier.
2336+
23302337
.. option:: -fforce-emit-vtables
23312338

23322339
In order to improve devirtualization, forces emitting of vtables even in

clang/include/clang/Basic/CodeGenOptions.def

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,6 @@ CODEGENOPT(SanitizeCfiICallNormalizeIntegers, 1, 0) ///< Normalize integer types
278278
///< CFI icall function signatures
279279
CODEGENOPT(SanitizeCfiCanonicalJumpTables, 1, 0) ///< Make jump table symbols canonical
280280
///< instead of creating a local jump table.
281-
CODEGENOPT(UniqueSourceFileNames, 1, 0) ///< Allow the compiler to assume that TUs
282-
///< have unique source file names at link time
283281
CODEGENOPT(SanitizeKcfiArity, 1, 0) ///< Embed arity in KCFI patchable function prefix
284282
CODEGENOPT(SanitizeCoverageType, 2, 0) ///< Type of sanitizer coverage
285283
///< instrumentation.

clang/include/clang/Basic/CodeGenOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,10 @@ class CodeGenOptions : public CodeGenOptionsBase {
338338
/// -fsymbol-partition (see https://lld.llvm.org/Partitions.html).
339339
std::string SymbolPartition;
340340

341+
/// If non-empty, allow the compiler to assume that the given source file
342+
/// identifier is unique at link time.
343+
std::string UniqueSourceFileIdentifier;
344+
341345
enum RemarkKind {
342346
RK_Missing, // Remark argument not present on the command line.
343347
RK_Enabled, // Remark enabled via '-Rgroup'.

clang/include/clang/Driver/Options.td

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4204,13 +4204,15 @@ def ftrigraphs : Flag<["-"], "ftrigraphs">, Group<f_Group>,
42044204
def fno_trigraphs : Flag<["-"], "fno-trigraphs">, Group<f_Group>,
42054205
HelpText<"Do not process trigraph sequences">,
42064206
Visibility<[ClangOption, CC1Option]>;
4207-
defm unique_source_file_names: BoolOption<"f", "unique-source-file-names",
4208-
CodeGenOpts<"UniqueSourceFileNames">, DefaultFalse,
4209-
PosFlag<SetTrue, [], [CC1Option], "Allow">,
4210-
NegFlag<SetFalse, [], [], "Do not allow">,
4211-
BothFlags<[], [ClangOption], " the compiler to assume that each translation unit has a unique "
4212-
"source file name at link time">>,
4213-
Group<f_clang_Group>;
4207+
def funique_source_file_names: Flag<["-"], "funique-source-file-names">, Group<f_Group>,
4208+
HelpText<"Allow the compiler to assume that each translation unit has a unique "
4209+
"source file identifier (see -funique-source-file-identifier) at link time">;
4210+
def fno_unique_source_file_names: Flag<["-"], "fno-unique-source-file-names">;
4211+
def unique_source_file_identifier_EQ: Joined<["-"], "funique-source-file-identifier=">, Group<f_Group>,
4212+
Visibility<[ClangOption, CC1Option]>,
4213+
HelpText<"Specify the source file identifier for -funique-source-file-names; "
4214+
"uses the source file path if not specified">,
4215+
MarshallingInfoString<CodeGenOpts<"UniqueSourceFileIdentifier">>;
42144216
def funsigned_bitfields : Flag<["-"], "funsigned-bitfields">, Group<f_Group>;
42154217
def funsigned_char : Flag<["-"], "funsigned-char">, Group<f_Group>;
42164218
def fno_unsigned_char : Flag<["-"], "fno-unsigned-char">;

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,8 +1146,13 @@ void CodeGenModule::Release() {
11461146
1);
11471147
}
11481148

1149-
if (CodeGenOpts.UniqueSourceFileNames) {
1150-
getModule().addModuleFlag(llvm::Module::Max, "Unique Source File Names", 1);
1149+
if (!CodeGenOpts.UniqueSourceFileIdentifier.empty()) {
1150+
getModule().addModuleFlag(
1151+
llvm::Module::Append, "Unique Source File Identifier",
1152+
llvm::MDTuple::get(
1153+
TheModule.getContext(),
1154+
llvm::MDString::get(TheModule.getContext(),
1155+
CodeGenOpts.UniqueSourceFileIdentifier)));
11511156
}
11521157

11531158
if (LangOpts.Sanitize.has(SanitizerKind::KCFI)) {

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7740,8 +7740,14 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
77407740
Args.addOptInFlag(CmdArgs, options::OPT_fexperimental_late_parse_attributes,
77417741
options::OPT_fno_experimental_late_parse_attributes);
77427742

7743-
Args.addOptInFlag(CmdArgs, options::OPT_funique_source_file_names,
7744-
options::OPT_fno_unique_source_file_names);
7743+
if (Args.hasFlag(options::OPT_funique_source_file_names,
7744+
options::OPT_fno_unique_source_file_names, false)) {
7745+
if (Arg *A = Args.getLastArg(options::OPT_unique_source_file_identifier_EQ))
7746+
A->render(Args, CmdArgs);
7747+
else
7748+
CmdArgs.push_back(Args.MakeArgString(
7749+
Twine("-funique-source-file-identifier=") + Input.getBaseInput()));
7750+
}
77457751

77467752
// Setup statistics file output.
77477753
SmallString<128> StatsFile = getStatsFileName(Args, Output, Input, D);
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
// RUN: %clang_cc1 -funique-source-file-names -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s
2-
// CHECK: !{i32 7, !"Unique Source File Names", i32 1}
1+
// RUN: %clang_cc1 -funique-source-file-identifier=foo -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s
2+
// CHECK: !{i32 5, !"Unique Source File Identifier", ![[MD:[0-9]*]]}
3+
// CHECK: ![[MD]] = !{!"foo"}
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
// RUN: %clang -funique-source-file-names -### %s 2> %t
2-
// RUN: FileCheck < %t %s
2+
// RUN: FileCheck --check-prefix=SRC < %t %s
33

4-
// CHECK: "-cc1"
5-
// CHECK: "-funique-source-file-names"
4+
// SRC: "-cc1"
5+
// SRC: "-funique-source-file-identifier={{.*}}unique-source-file-names.c"
6+
7+
// RUN: %clang -funique-source-file-names -funique-source-file-identifier=foo -### %s 2> %t
8+
// RUN: FileCheck --check-prefix=ID < %t %s
9+
10+
// ID: "-cc1"
11+
// ID: "-funique-source-file-identifier=foo"

llvm/lib/Transforms/Utils/ModuleUtils.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/IR/IRBuilder.h"
1919
#include "llvm/IR/MDBuilder.h"
2020
#include "llvm/IR/Module.h"
21+
#include "llvm/Support/Casting.h"
2122
#include "llvm/Support/MD5.h"
2223
#include "llvm/Support/raw_ostream.h"
2324
#include "llvm/Support/xxhash.h"
@@ -346,10 +347,11 @@ void llvm::filterDeadComdatFunctions(
346347
std::string llvm::getUniqueModuleId(Module *M) {
347348
MD5 Md5;
348349

349-
auto *UniqueSourceFileNames = mdconst::extract_or_null<ConstantInt>(
350-
M->getModuleFlag("Unique Source File Names"));
351-
if (UniqueSourceFileNames && UniqueSourceFileNames->getZExtValue()) {
352-
Md5.update(M->getSourceFileName());
350+
auto *UniqueSourceFileIdentifier = dyn_cast_or_null<MDNode>(
351+
M->getModuleFlag("Unique Source File Identifier"));
352+
if (UniqueSourceFileIdentifier) {
353+
Md5.update(
354+
cast<MDString>(UniqueSourceFileIdentifier->getOperand(0))->getString());
353355
} else {
354356
bool ExportsSymbols = false;
355357
for (auto &GV : M->global_values()) {

llvm/test/Transforms/ThinLTOBitcodeWriter/unique-source-file-names.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ define internal void @f() {
1919
!0 = !{i32 0, !"typeid"}
2020

2121
!llvm.module.flags = !{!1}
22-
!1 = !{i32 1, !"Unique Source File Names", i32 1}
22+
!1 = !{i32 5, !"Unique Source File Identifier", !2}
23+
!2 = !{!"unique-source-file-names.c"}

0 commit comments

Comments
 (0)