aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CIR/CodeGen/CIRGenRecordLayout.h2
-rw-r--r--clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp90
-rw-r--r--clang/lib/Driver/ToolChains/CommonArgs.cpp48
-rw-r--r--clang/lib/Driver/ToolChains/Flang.cpp18
5 files changed, 93 insertions, 67 deletions
diff --git a/clang/lib/CIR/CodeGen/CIRGenRecordLayout.h b/clang/lib/CIR/CodeGen/CIRGenRecordLayout.h
index 914ef16..bf0ddc5 100644
--- a/clang/lib/CIR/CodeGen/CIRGenRecordLayout.h
+++ b/clang/lib/CIR/CodeGen/CIRGenRecordLayout.h
@@ -57,7 +57,7 @@ namespace clang::CIRGen {
/// cir.func @store_field() {
/// %0 = cir.alloca !rec_S, !cir.ptr<!rec_S>, ["s"] {alignment = 4 : i64}
/// %1 = cir.const #cir.int<2> : !s32i
-/// %2 = cir.cast(integral, %1 : !s32i), !u32i
+/// %2 = cir.cast integral %1 : !s32i -> !u32i
/// %3 = cir.get_member %0[3] {name = "more_bits"} : !cir.ptr<!rec_S> ->
/// !cir.ptr<!u16i>
/// %4 = cir.set_bitfield(#bfi_more_bits, %3 :
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 0f309e4..22f069d 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -2425,7 +2425,7 @@ static void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
// For instance, this CIR code:
//
// cir.func @foo(%arg0: !s32i) -> !s32i {
-// %4 = cir.cast(int_to_bool, %arg0 : !s32i), !cir.bool
+// %4 = cir.cast int_to_bool %arg0 : !s32i -> !cir.bool
// cir.if %4 {
// %5 = cir.const #cir.int<1> : !s32i
// cir.return %5 : !s32i
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index adaa6b3..412a176 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2723,42 +2723,6 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
}
}
-static void EmitComplexRangeDiag(const Driver &D, StringRef LastOpt,
- LangOptions::ComplexRangeKind Range,
- StringRef NewOpt,
- LangOptions::ComplexRangeKind NewRange) {
- // Do not emit a warning if NewOpt overrides LastOpt in the following cases.
- //
- // | LastOpt | NewOpt |
- // |-----------------------|-----------------------|
- // | -fcx-limited-range | -fno-cx-limited-range |
- // | -fno-cx-limited-range | -fcx-limited-range |
- // | -fcx-fortran-rules | -fno-cx-fortran-rules |
- // | -fno-cx-fortran-rules | -fcx-fortran-rules |
- // | -ffast-math | -fno-fast-math |
- // | -ffp-model= | -ffast-math |
- // | -ffp-model= | -fno-fast-math |
- // | -ffp-model= | -ffp-model= |
- // | -fcomplex-arithmetic= | -fcomplex-arithmetic= |
- if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
- (LastOpt == "-fcx-limited-range" && NewOpt == "-fno-cx-limited-range") ||
- (LastOpt == "-fno-cx-limited-range" && NewOpt == "-fcx-limited-range") ||
- (LastOpt == "-fcx-fortran-rules" && NewOpt == "-fno-cx-fortran-rules") ||
- (LastOpt == "-fno-cx-fortran-rules" && NewOpt == "-fcx-fortran-rules") ||
- (LastOpt == "-ffast-math" && NewOpt == "-fno-fast-math") ||
- (LastOpt.starts_with("-ffp-model=") && NewOpt == "-ffast-math") ||
- (LastOpt.starts_with("-ffp-model=") && NewOpt == "-fno-fast-math") ||
- (LastOpt.starts_with("-ffp-model=") &&
- NewOpt.starts_with("-ffp-model=")) ||
- (LastOpt.starts_with("-fcomplex-arithmetic=") &&
- NewOpt.starts_with("-fcomplex-arithmetic=")))
- return;
-
- D.Diag(clang::diag::warn_drv_overriding_complex_range)
- << LastOpt << NewOpt << complexRangeKindToStr(Range)
- << complexRangeKindToStr(NewRange);
-}
-
static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
bool OFastEnabled, const ArgList &Args,
ArgStringList &CmdArgs,
@@ -2815,27 +2779,19 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
std::string ComplexRangeStr;
StringRef LastComplexRangeOption;
- auto setComplexRange = [&](StringRef NewOption,
- LangOptions::ComplexRangeKind NewRange) {
- // Warn if user overrides the previously set complex number
- // multiplication/division option.
- if (Range != LangOptions::ComplexRangeKind::CX_None && Range != NewRange)
- EmitComplexRangeDiag(D, LastComplexRangeOption, Range, NewOption,
- NewRange);
- LastComplexRangeOption = NewOption;
- Range = NewRange;
- };
-
// Lambda to set fast-math options. This is also used by -ffp-model=fast
auto applyFastMath = [&](bool Aggressive, StringRef CallerOption) {
if (Aggressive) {
HonorINFs = false;
HonorNaNs = false;
- setComplexRange(CallerOption, LangOptions::ComplexRangeKind::CX_Basic);
+ setComplexRange(D, CallerOption, LangOptions::ComplexRangeKind::CX_Basic,
+ LastComplexRangeOption, Range);
} else {
HonorINFs = true;
HonorNaNs = true;
- setComplexRange(CallerOption, LangOptions::ComplexRangeKind::CX_Promoted);
+ setComplexRange(D, CallerOption,
+ LangOptions::ComplexRangeKind::CX_Promoted,
+ LastComplexRangeOption, Range);
}
MathErrno = false;
AssociativeMath = true;
@@ -2887,18 +2843,24 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
default: continue;
case options::OPT_fcx_limited_range:
- setComplexRange(A->getSpelling(),
- LangOptions::ComplexRangeKind::CX_Basic);
+ setComplexRange(D, A->getSpelling(),
+ LangOptions::ComplexRangeKind::CX_Basic,
+ LastComplexRangeOption, Range);
break;
case options::OPT_fno_cx_limited_range:
- setComplexRange(A->getSpelling(), LangOptions::ComplexRangeKind::CX_Full);
+ setComplexRange(D, A->getSpelling(),
+ LangOptions::ComplexRangeKind::CX_Full,
+ LastComplexRangeOption, Range);
break;
case options::OPT_fcx_fortran_rules:
- setComplexRange(A->getSpelling(),
- LangOptions::ComplexRangeKind::CX_Improved);
+ setComplexRange(D, A->getSpelling(),
+ LangOptions::ComplexRangeKind::CX_Improved,
+ LastComplexRangeOption, Range);
break;
case options::OPT_fno_cx_fortran_rules:
- setComplexRange(A->getSpelling(), LangOptions::ComplexRangeKind::CX_Full);
+ setComplexRange(D, A->getSpelling(),
+ LangOptions::ComplexRangeKind::CX_Full,
+ LastComplexRangeOption, Range);
break;
case options::OPT_fcomplex_arithmetic_EQ: {
LangOptions::ComplexRangeKind RangeVal;
@@ -2916,7 +2878,8 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
<< A->getSpelling() << Val;
break;
}
- setComplexRange(Args.MakeArgString(A->getSpelling() + Val), RangeVal);
+ setComplexRange(D, Args.MakeArgString(A->getSpelling() + Val), RangeVal,
+ LastComplexRangeOption, Range);
break;
}
case options::OPT_ffp_model_EQ: {
@@ -2956,8 +2919,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
FPModel = Val;
FPContract = "on";
LastFpContractOverrideOption = "-ffp-model=precise";
- setComplexRange(Args.MakeArgString(A->getSpelling() + Val),
- LangOptions::ComplexRangeKind::CX_Full);
+ setComplexRange(D, Args.MakeArgString(A->getSpelling() + Val),
+ LangOptions::ComplexRangeKind::CX_Full,
+ LastComplexRangeOption, Range);
} else if (Val == "strict") {
StrictFPModel = true;
FPExceptionBehavior = "strict";
@@ -2966,8 +2930,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
LastFpContractOverrideOption = "-ffp-model=strict";
TrappingMath = true;
RoundingFPMath = true;
- setComplexRange(Args.MakeArgString(A->getSpelling() + Val),
- LangOptions::ComplexRangeKind::CX_Full);
+ setComplexRange(D, Args.MakeArgString(A->getSpelling() + Val),
+ LangOptions::ComplexRangeKind::CX_Full,
+ LastComplexRangeOption, Range);
} else
D.Diag(diag::err_drv_unsupported_option_argument)
<< A->getSpelling() << Val;
@@ -3174,8 +3139,9 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D,
SignedZeros = true;
restoreFPContractState();
if (Range != LangOptions::ComplexRangeKind::CX_Full)
- setComplexRange(A->getSpelling(),
- LangOptions::ComplexRangeKind::CX_None);
+ setComplexRange(D, A->getSpelling(),
+ LangOptions::ComplexRangeKind::CX_None,
+ LastComplexRangeOption, Range);
else
Range = LangOptions::ComplexRangeKind::CX_None;
LastComplexRangeOption = "";
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index cce4f64..49ee53f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3557,3 +3557,51 @@ tools::renderComplexRangeOption(LangOptionsBase::ComplexRangeKind Range) {
return "-complex-range=" + ComplexRangeStr;
return ComplexRangeStr;
}
+
+static void emitComplexRangeDiag(const Driver &D, StringRef LastOpt,
+ LangOptions::ComplexRangeKind Range,
+ StringRef NewOpt,
+ LangOptions::ComplexRangeKind NewRange) {
+ // Do not emit a warning if NewOpt overrides LastOpt in the following cases.
+ //
+ // | LastOpt | NewOpt |
+ // |-----------------------|-----------------------|
+ // | -fcx-limited-range | -fno-cx-limited-range |
+ // | -fno-cx-limited-range | -fcx-limited-range |
+ // | -fcx-fortran-rules | -fno-cx-fortran-rules |
+ // | -fno-cx-fortran-rules | -fcx-fortran-rules |
+ // | -ffast-math | -fno-fast-math |
+ // | -ffp-model= | -ffast-math |
+ // | -ffp-model= | -fno-fast-math |
+ // | -ffp-model= | -ffp-model= |
+ // | -fcomplex-arithmetic= | -fcomplex-arithmetic= |
+ if (LastOpt == NewOpt || NewOpt.empty() || LastOpt.empty() ||
+ (LastOpt == "-fcx-limited-range" && NewOpt == "-fno-cx-limited-range") ||
+ (LastOpt == "-fno-cx-limited-range" && NewOpt == "-fcx-limited-range") ||
+ (LastOpt == "-fcx-fortran-rules" && NewOpt == "-fno-cx-fortran-rules") ||
+ (LastOpt == "-fno-cx-fortran-rules" && NewOpt == "-fcx-fortran-rules") ||
+ (LastOpt == "-ffast-math" && NewOpt == "-fno-fast-math") ||
+ (LastOpt.starts_with("-ffp-model=") && NewOpt == "-ffast-math") ||
+ (LastOpt.starts_with("-ffp-model=") && NewOpt == "-fno-fast-math") ||
+ (LastOpt.starts_with("-ffp-model=") &&
+ NewOpt.starts_with("-ffp-model=")) ||
+ (LastOpt.starts_with("-fcomplex-arithmetic=") &&
+ NewOpt.starts_with("-fcomplex-arithmetic=")))
+ return;
+
+ D.Diag(clang::diag::warn_drv_overriding_complex_range)
+ << LastOpt << NewOpt << complexRangeKindToStr(Range)
+ << complexRangeKindToStr(NewRange);
+}
+
+void tools::setComplexRange(const Driver &D, StringRef NewOpt,
+ LangOptions::ComplexRangeKind NewRange,
+ StringRef &LastOpt,
+ LangOptions::ComplexRangeKind &Range) {
+ // Warn if user overrides the previously set complex number
+ // multiplication/division option.
+ if (Range != LangOptions::ComplexRangeKind::CX_None && Range != NewRange)
+ emitComplexRangeDiag(D, LastOpt, Range, NewOpt, NewRange);
+ LastOpt = NewOpt;
+ Range = NewRange;
+}
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index a539481..426bc52 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -693,6 +693,7 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
bool AssociativeMath = false;
bool ReciprocalMath = false;
+ StringRef LastComplexRangeOption;
LangOptions::ComplexRangeKind Range = LangOptions::ComplexRangeKind::CX_None;
if (const Arg *A = Args.getLastArg(options::OPT_ffp_contract)) {
@@ -720,17 +721,22 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
continue;
case options::OPT_fcomplex_arithmetic_EQ: {
+ LangOptions::ComplexRangeKind NewRange;
StringRef Val = A->getValue();
if (Val == "full")
- Range = LangOptions::ComplexRangeKind::CX_Full;
+ NewRange = LangOptions::ComplexRangeKind::CX_Full;
else if (Val == "improved")
- Range = LangOptions::ComplexRangeKind::CX_Improved;
+ NewRange = LangOptions::ComplexRangeKind::CX_Improved;
else if (Val == "basic")
- Range = LangOptions::ComplexRangeKind::CX_Basic;
+ NewRange = LangOptions::ComplexRangeKind::CX_Basic;
else {
D.Diag(diag::err_drv_unsupported_option_argument)
<< A->getSpelling() << Val;
+ break;
}
+
+ setComplexRange(D, Args.MakeArgString(A->getSpelling() + Val), NewRange,
+ LastComplexRangeOption, Range);
break;
}
case options::OPT_fhonor_infinities:
@@ -779,6 +785,9 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
ApproxFunc = true;
SignedZeros = false;
FPContract = "fast";
+ setComplexRange(D, A->getSpelling(),
+ LangOptions::ComplexRangeKind::CX_Basic,
+ LastComplexRangeOption, Range);
break;
case options::OPT_fno_fast_math:
HonorINFs = true;
@@ -792,6 +801,9 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
// --ffp-contract=off -fno-fast-math --> -ffp-contract=off
if (FPContract == "fast")
FPContract = "";
+ setComplexRange(D, A->getSpelling(),
+ LangOptions::ComplexRangeKind::CX_None,
+ LastComplexRangeOption, Range);
break;
}