100 lines
4.4 KiB
Diff
100 lines
4.4 KiB
Diff
|
From 11857d49948b845dcfd7c7f78595095e3add012d Mon Sep 17 00:00:00 2001
|
||
|
From: Rong Xu <xur@google.com>
|
||
|
Date: Tue, 25 Feb 2020 08:04:01 -0800
|
||
|
Subject: [PATCH] [remark][diagnostics] [codegen] Fix PR44896
|
||
|
|
||
|
This patch fixes PR44896. For IR input files, option fdiscard-value-names
|
||
|
should be ignored as we need named values in loadModule().
|
||
|
Commit 60d3947922 sets this option after loadModule() where valued names
|
||
|
already created. This creates an inconsistent state in setNameImpl()
|
||
|
that leads to a seg fault.
|
||
|
This patch forces fdiscard-value-names to be false for IR input files.
|
||
|
|
||
|
This patch also emits a warning of "ignoring -fdiscard-value-names" if
|
||
|
option fdiscard-value-names is explictly enabled in the commandline for
|
||
|
IR input files.
|
||
|
|
||
|
Differential Revision: https://reviews.llvm.org/D74878
|
||
|
---
|
||
|
clang/include/clang/Basic/DiagnosticDriverKinds.td | 3 +++
|
||
|
clang/lib/CodeGen/CodeGenAction.cpp | 3 +++
|
||
|
clang/lib/Driver/ToolChains/Clang.cpp | 10 +++++++++-
|
||
|
clang/test/CodeGen/PR44896.ll | 15 +++++++++++++++
|
||
|
4 files changed, 30 insertions(+), 1 deletion(-)
|
||
|
create mode 100644 clang/test/CodeGen/PR44896.ll
|
||
|
|
||
|
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
|
||
|
index ecd871e..48ece91 100644
|
||
|
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
|
||
|
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
|
||
|
@@ -271,6 +271,9 @@ def warn_drv_unsupported_debug_info_opt_for_target : Warning<
|
||
|
InGroup<UnsupportedTargetOpt>;
|
||
|
def warn_c_kext : Warning<
|
||
|
"ignoring -fapple-kext which is valid for C++ and Objective-C++ only">;
|
||
|
+def warn_ignoring_fdiscard_for_bitcode : Warning<
|
||
|
+ "ignoring -fdiscard-value-names for LLVM Bitcode">,
|
||
|
+ InGroup<UnusedCommandLineArgument>;
|
||
|
def warn_drv_input_file_unused : Warning<
|
||
|
"%0: '%1' input unused%select{ when '%3' is present|}2">,
|
||
|
InGroup<UnusedCommandLineArgument>;
|
||
|
diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp
|
||
|
index 5ebc34c..81946b1 100644
|
||
|
--- a/clang/lib/CodeGen/CodeGenAction.cpp
|
||
|
+++ b/clang/lib/CodeGen/CodeGenAction.cpp
|
||
|
@@ -1146,6 +1146,9 @@ void CodeGenAction::ExecuteAction() {
|
||
|
CI.getTargetOpts(), CI.getLangOpts(),
|
||
|
CI.getFrontendOpts().ShowTimers,
|
||
|
std::move(LinkModules), *VMContext, nullptr);
|
||
|
+ // PR44896: Force DiscardValueNames as false. DiscardValueNames cannot be
|
||
|
+ // true here because the valued names are needed for reading textual IR.
|
||
|
+ Ctx.setDiscardValueNames(false);
|
||
|
Ctx.setDiagnosticHandler(
|
||
|
std::make_unique<ClangDiagnosticHandler>(CodeGenOpts, &Result));
|
||
|
|
||
|
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
|
||
|
index 19a23c9..d387a1d 100644
|
||
|
--- a/clang/lib/Driver/ToolChains/Clang.cpp
|
||
|
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
|
||
|
@@ -4332,8 +4332,16 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
||
|
|
||
|
// Discard value names in assert builds unless otherwise specified.
|
||
|
if (Args.hasFlag(options::OPT_fdiscard_value_names,
|
||
|
- options::OPT_fno_discard_value_names, !IsAssertBuild))
|
||
|
+ options::OPT_fno_discard_value_names, !IsAssertBuild)) {
|
||
|
+ if (Args.hasArg(options::OPT_fdiscard_value_names) &&
|
||
|
+ (std::any_of(Inputs.begin(), Inputs.end(),
|
||
|
+ [](const clang::driver::InputInfo &II) {
|
||
|
+ return types::isLLVMIR(II.getType());
|
||
|
+ }))) {
|
||
|
+ D.Diag(diag::warn_ignoring_fdiscard_for_bitcode);
|
||
|
+ }
|
||
|
CmdArgs.push_back("-discard-value-names");
|
||
|
+ }
|
||
|
|
||
|
// Set the main file name, so that debug info works even with
|
||
|
// -save-temps.
|
||
|
diff --git a/clang/test/CodeGen/PR44896.ll b/clang/test/CodeGen/PR44896.ll
|
||
|
new file mode 100644
|
||
|
index 0000000..a4d3445
|
||
|
--- /dev/null
|
||
|
+++ b/clang/test/CodeGen/PR44896.ll
|
||
|
@@ -0,0 +1,15 @@
|
||
|
+; RUN: %clang -fdiscard-value-names -S %s -o /dev/null 2>&1 | FileCheck --check-prefix=WARNING %s
|
||
|
+; RUN: %clang -S %s -o /dev/null 2>&1 | FileCheck --check-prefix=NOWARNING %s
|
||
|
+; RUN: %clang_cc1 -S -emit-llvm %s -discard-value-names -o /dev/null
|
||
|
+; PR 44896
|
||
|
+
|
||
|
+; WARNING: ignoring -fdiscard-value-names for LLVM Bitcode
|
||
|
+; NOWARNING-NOT: ignoring -fdiscard-value-names for LLVM Bitcode
|
||
|
+
|
||
|
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||
|
+target triple = "x86_64--linux-gnu"
|
||
|
+
|
||
|
+define linkonce i8* @b(i8* %a) {
|
||
|
+ ret i8* %a
|
||
|
+}
|
||
|
+
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|