svn commit: r363581 - in vendor/llvm-project/release-11.x: clang/include/clang/Driver clang/include/clang/Sema clang/lib/AST clang/lib/Basic/Targets clang/lib/CodeGen clang/lib/Driver clang/lib/Dri...
Dimitry Andric
dim at FreeBSD.org
Sun Jul 26 19:46:34 UTC 2020
Author: dim
Date: Sun Jul 26 19:46:28 2020
New Revision: 363581
URL: https://svnweb.freebsd.org/changeset/base/363581
Log:
Vendor import of llvm-project branch release/11.x
llvmorg-11-init-20933-g3c1fca803bc.
Added:
vendor/llvm-project/release-11.x/llvm/include/llvm/Support/RISCVTargetParser.def
Modified:
vendor/llvm-project/release-11.x/clang/include/clang/Driver/Options.td
vendor/llvm-project/release-11.x/clang/include/clang/Sema/SemaInternal.h
vendor/llvm-project/release-11.x/clang/lib/AST/ExprConstant.cpp
vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.cpp
vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.h
vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntime.cpp
vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
vendor/llvm-project/release-11.x/clang/lib/CodeGen/CodeGenFunction.cpp
vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Clang.cpp
vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/CommonArgs.cpp
vendor/llvm-project/release-11.x/clang/lib/Driver/Types.cpp
vendor/llvm-project/release-11.x/clang/lib/Frontend/CompilerInvocation.cpp
vendor/llvm-project/release-11.x/clang/lib/Sema/SemaExprCXX.cpp
vendor/llvm-project/release-11.x/clang/lib/Sema/SemaOpenMP.cpp
vendor/llvm-project/release-11.x/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp
vendor/llvm-project/release-11.x/lld/COFF/SymbolTable.cpp
vendor/llvm-project/release-11.x/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
vendor/llvm-project/release-11.x/llvm/include/llvm/IR/IRBuilder.h
vendor/llvm-project/release-11.x/llvm/include/llvm/Support/TargetParser.h
vendor/llvm-project/release-11.x/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h
vendor/llvm-project/release-11.x/llvm/lib/Analysis/AssumeBundleQueries.cpp
vendor/llvm-project/release-11.x/llvm/lib/Analysis/ConstantFolding.cpp
vendor/llvm-project/release-11.x/llvm/lib/Analysis/InstructionSimplify.cpp
vendor/llvm-project/release-11.x/llvm/lib/Analysis/ScalarEvolution.cpp
vendor/llvm-project/release-11.x/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp
vendor/llvm-project/release-11.x/llvm/lib/IR/ConstantFold.cpp
vendor/llvm-project/release-11.x/llvm/lib/IR/IRBuilder.cpp
vendor/llvm-project/release-11.x/llvm/lib/IR/Verifier.cpp
vendor/llvm-project/release-11.x/llvm/lib/MC/MCParser/MasmParser.cpp
vendor/llvm-project/release-11.x/llvm/lib/Object/RelocationResolver.cpp
vendor/llvm-project/release-11.x/llvm/lib/Support/TargetParser.cpp
vendor/llvm-project/release-11.x/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
vendor/llvm-project/release-11.x/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
vendor/llvm-project/release-11.x/llvm/lib/Target/PowerPC/PPCInstr64Bit.td
vendor/llvm-project/release-11.x/llvm/lib/Target/PowerPC/PPCInstrInfo.td
vendor/llvm-project/release-11.x/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
vendor/llvm-project/release-11.x/llvm/lib/Target/RISCV/RISCV.td
vendor/llvm-project/release-11.x/llvm/lib/Target/X86/AsmParser/X86Operand.h
vendor/llvm-project/release-11.x/llvm/lib/Target/X86/X86ISelLowering.cpp
vendor/llvm-project/release-11.x/llvm/lib/Target/X86/X86InstrInfo.td
vendor/llvm-project/release-11.x/llvm/lib/Target/X86/X86InstrSystem.td
vendor/llvm-project/release-11.x/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
vendor/llvm-project/release-11.x/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
vendor/llvm-project/release-11.x/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
vendor/llvm-project/release-11.x/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
vendor/llvm-project/release-11.x/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp
vendor/llvm-project/release-11.x/llvm/utils/TableGen/X86RecognizableInstr.cpp
Modified: vendor/llvm-project/release-11.x/clang/include/clang/Driver/Options.td
==============================================================================
--- vendor/llvm-project/release-11.x/clang/include/clang/Driver/Options.td Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/include/clang/Driver/Options.td Sun Jul 26 19:46:28 2020 (r363581)
@@ -1440,6 +1440,10 @@ def fpch_instantiate_templates:
def fno_pch_instantiate_templates:
Flag <["-"], "fno-pch-instantiate-templates">,
Group<f_Group>, Flags<[CC1Option]>;
+defm pch_codegen: OptInFFlag<"pch-codegen", "Generate ", "Do not generate ",
+ "code for uses of this PCH that assumes an explicit object file will be built for the PCH">;
+defm pch_debuginfo: OptInFFlag<"pch-debuginfo", "Generate ", "Do not generate ",
+ "debug info for types in an object file built from this PCH and do not generate them elsewhere">;
def fmodules : Flag <["-"], "fmodules">, Group<f_Group>,
Flags<[DriverOption, CC1Option]>,
Modified: vendor/llvm-project/release-11.x/clang/include/clang/Sema/SemaInternal.h
==============================================================================
--- vendor/llvm-project/release-11.x/clang/include/clang/Sema/SemaInternal.h Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/include/clang/Sema/SemaInternal.h Sun Jul 26 19:46:28 2020 (r363581)
@@ -168,6 +168,11 @@ class TypoCorrectionConsumer : public VisibleDeclConsu
return TC;
}
+ /// In the case of deeply invalid expressions, `getNextCorrection()` will
+ /// never be called since the transform never makes progress. If we don't
+ /// detect this we risk trying to correct typos forever.
+ bool hasMadeAnyCorrectionProgress() const { return CurrentTCIndex != 0; }
+
/// Reset the consumer's position in the stream of viable corrections
/// (i.e. getNextCorrection() will return each of the previously returned
/// corrections in order before returning any new corrections).
Modified: vendor/llvm-project/release-11.x/clang/lib/AST/ExprConstant.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/AST/ExprConstant.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/AST/ExprConstant.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -9930,8 +9930,7 @@ namespace {
const ConstantArrayType *CAT =
Info.Ctx.getAsConstantArrayType(E->getType());
if (!CAT) {
- if (const IncompleteArrayType *IAT =
- Info.Ctx.getAsIncompleteArrayType(E->getType())) {
+ if (E->getType()->isIncompleteArrayType()) {
// We can be asked to zero-initialize a flexible array member; this
// is represented as an ImplicitValueInitExpr of incomplete array
// type. In this case, the array has zero elements.
Modified: vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -13,6 +13,7 @@
#include "RISCV.h"
#include "clang/Basic/MacroBuilder.h"
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/Support/TargetParser.h"
using namespace clang;
using namespace clang::targets;
@@ -165,4 +166,24 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector
}
return true;
+}
+
+bool RISCV32TargetInfo::isValidCPUName(StringRef Name) const {
+ return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name),
+ /*Is64Bit=*/false);
+}
+
+void RISCV32TargetInfo::fillValidCPUList(
+ SmallVectorImpl<StringRef> &Values) const {
+ llvm::RISCV::fillValidCPUArchList(Values, false);
+}
+
+bool RISCV64TargetInfo::isValidCPUName(StringRef Name) const {
+ return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name),
+ /*Is64Bit=*/true);
+}
+
+void RISCV64TargetInfo::fillValidCPUList(
+ SmallVectorImpl<StringRef> &Values) const {
+ llvm::RISCV::fillValidCPUArchList(Values, true);
}
Modified: vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.h
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.h Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Basic/Targets/RISCV.h Sun Jul 26 19:46:28 2020 (r363581)
@@ -24,7 +24,7 @@ namespace targets {
// RISC-V Target
class RISCVTargetInfo : public TargetInfo {
protected:
- std::string ABI;
+ std::string ABI, CPU;
bool HasM;
bool HasA;
bool HasF;
@@ -44,6 +44,13 @@ class RISCVTargetInfo : public TargetInfo { (public)
WIntType = UnsignedInt;
}
+ bool setCPU(const std::string &Name) override {
+ if (!isValidCPUName(Name))
+ return false;
+ CPU = Name;
+ return true;
+ }
+
StringRef getABI() const override { return ABI; }
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
@@ -97,6 +104,9 @@ class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : publ
return false;
}
+ bool isValidCPUName(StringRef Name) const override;
+ void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
+
void setMaxAtomicWidth() override {
MaxAtomicPromoteWidth = 128;
@@ -120,6 +130,9 @@ class LLVM_LIBRARY_VISIBILITY RISCV64TargetInfo : publ
}
return false;
}
+
+ bool isValidCPUName(StringRef Name) const override;
+ void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
void setMaxAtomicWidth() override {
MaxAtomicPromoteWidth = 128;
Modified: vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntime.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntime.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntime.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -886,8 +886,11 @@ void ReductionCodeGen::emitInitialization(
SharedType, SharedAddresses[N].first.getBaseInfo(),
CGF.CGM.getTBAAInfoForSubobject(SharedAddresses[N].first, SharedType));
if (CGF.getContext().getAsArrayType(PrivateVD->getType())) {
+ if (DRD && DRD->getInitializer())
+ (void)DefaultInit(CGF);
emitAggregateInitialization(CGF, N, PrivateAddr, SharedLVal, DRD);
} else if (DRD && (DRD->getInitializer() || !PrivateVD->hasInit())) {
+ (void)DefaultInit(CGF);
emitInitWithReductionInitializer(CGF, DRD, ClausesData[N].ReductionOp,
PrivateAddr, SharedLVal.getAddress(CGF),
SharedLVal.getType());
Modified: vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -4770,6 +4770,7 @@ Address CGOpenMPRuntimeNVPTX::getAddressOfLocalVariabl
const VarDecl *VD) {
if (VD && VD->hasAttr<OMPAllocateDeclAttr>()) {
const auto *A = VD->getAttr<OMPAllocateDeclAttr>();
+ auto AS = LangAS::Default;
switch (A->getAllocatorType()) {
// Use the default allocator here as by default local vars are
// threadlocal.
@@ -4783,42 +4784,30 @@ Address CGOpenMPRuntimeNVPTX::getAddressOfLocalVariabl
case OMPAllocateDeclAttr::OMPUserDefinedMemAlloc:
// TODO: implement aupport for user-defined allocators.
return Address::invalid();
- case OMPAllocateDeclAttr::OMPConstMemAlloc: {
- llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
- auto *GV = new llvm::GlobalVariable(
- CGM.getModule(), VarTy, /*isConstant=*/false,
- llvm::GlobalValue::InternalLinkage,
- llvm::Constant::getNullValue(VarTy), VD->getName(),
- /*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal,
- CGM.getContext().getTargetAddressSpace(LangAS::cuda_constant));
- CharUnits Align = CGM.getContext().getDeclAlign(VD);
- GV->setAlignment(Align.getAsAlign());
- return Address(GV, Align);
- }
- case OMPAllocateDeclAttr::OMPPTeamMemAlloc: {
- llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
- auto *GV = new llvm::GlobalVariable(
- CGM.getModule(), VarTy, /*isConstant=*/false,
- llvm::GlobalValue::InternalLinkage,
- llvm::Constant::getNullValue(VarTy), VD->getName(),
- /*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal,
- CGM.getContext().getTargetAddressSpace(LangAS::cuda_shared));
- CharUnits Align = CGM.getContext().getDeclAlign(VD);
- GV->setAlignment(Align.getAsAlign());
- return Address(GV, Align);
- }
+ case OMPAllocateDeclAttr::OMPConstMemAlloc:
+ AS = LangAS::cuda_constant;
+ break;
+ case OMPAllocateDeclAttr::OMPPTeamMemAlloc:
+ AS = LangAS::cuda_shared;
+ break;
case OMPAllocateDeclAttr::OMPLargeCapMemAlloc:
- case OMPAllocateDeclAttr::OMPCGroupMemAlloc: {
- llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
- auto *GV = new llvm::GlobalVariable(
- CGM.getModule(), VarTy, /*isConstant=*/false,
- llvm::GlobalValue::InternalLinkage,
- llvm::Constant::getNullValue(VarTy), VD->getName());
- CharUnits Align = CGM.getContext().getDeclAlign(VD);
- GV->setAlignment(Align.getAsAlign());
- return Address(GV, Align);
+ case OMPAllocateDeclAttr::OMPCGroupMemAlloc:
+ break;
}
- }
+ llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
+ auto *GV = new llvm::GlobalVariable(
+ CGM.getModule(), VarTy, /*isConstant=*/false,
+ llvm::GlobalValue::InternalLinkage, llvm::Constant::getNullValue(VarTy),
+ VD->getName(),
+ /*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal,
+ CGM.getContext().getTargetAddressSpace(AS));
+ CharUnits Align = CGM.getContext().getDeclAlign(VD);
+ GV->setAlignment(Align.getAsAlign());
+ return Address(
+ CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
+ GV, VarTy->getPointerTo(CGM.getContext().getTargetAddressSpace(
+ VD->getType().getAddressSpace()))),
+ Align);
}
if (getDataSharingMode(CGM) != CGOpenMPRuntimeNVPTX::Generic)
Modified: vendor/llvm-project/release-11.x/clang/lib/CodeGen/CodeGenFunction.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/CodeGen/CodeGenFunction.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/CodeGen/CodeGenFunction.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -2154,39 +2154,13 @@ void CodeGenFunction::emitAlignmentAssumption(llvm::Va
SourceLocation AssumptionLoc,
llvm::Value *Alignment,
llvm::Value *OffsetValue) {
- if (Alignment->getType() != IntPtrTy)
- Alignment =
- Builder.CreateIntCast(Alignment, IntPtrTy, false, "casted.align");
- if (OffsetValue && OffsetValue->getType() != IntPtrTy)
- OffsetValue =
- Builder.CreateIntCast(OffsetValue, IntPtrTy, true, "casted.offset");
- llvm::Value *TheCheck = nullptr;
+ llvm::Value *TheCheck;
+ llvm::Instruction *Assumption = Builder.CreateAlignmentAssumption(
+ CGM.getDataLayout(), PtrValue, Alignment, OffsetValue, &TheCheck);
if (SanOpts.has(SanitizerKind::Alignment)) {
- llvm::Value *PtrIntValue =
- Builder.CreatePtrToInt(PtrValue, IntPtrTy, "ptrint");
-
- if (OffsetValue) {
- bool IsOffsetZero = false;
- if (const auto *CI = dyn_cast<llvm::ConstantInt>(OffsetValue))
- IsOffsetZero = CI->isZero();
-
- if (!IsOffsetZero)
- PtrIntValue = Builder.CreateSub(PtrIntValue, OffsetValue, "offsetptr");
- }
-
- llvm::Value *Zero = llvm::ConstantInt::get(IntPtrTy, 0);
- llvm::Value *Mask =
- Builder.CreateSub(Alignment, llvm::ConstantInt::get(IntPtrTy, 1));
- llvm::Value *MaskedPtr = Builder.CreateAnd(PtrIntValue, Mask, "maskedptr");
- TheCheck = Builder.CreateICmpEQ(MaskedPtr, Zero, "maskcond");
+ emitAlignmentAssumptionCheck(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
+ OffsetValue, TheCheck, Assumption);
}
- llvm::Instruction *Assumption = Builder.CreateAlignmentAssumption(
- CGM.getDataLayout(), PtrValue, Alignment, OffsetValue);
-
- if (!SanOpts.has(SanitizerKind::Alignment))
- return;
- emitAlignmentAssumptionCheck(PtrValue, Ty, Loc, AssumptionLoc, Alignment,
- OffsetValue, TheCheck, Assumption);
}
void CodeGenFunction::emitAlignmentAssumption(llvm::Value *PtrValue,
Modified: vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Arch/RISCV.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Arch/RISCV.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -446,6 +446,19 @@ static bool getArchFeatures(const Driver &D, StringRef
return true;
}
+// Get features except standard extension feature
+void getRISCFeaturesFromMcpu(const Driver &D, const llvm::Triple &Triple,
+ const llvm::opt::ArgList &Args,
+ const llvm::opt::Arg *A, StringRef Mcpu,
+ std::vector<StringRef> &Features) {
+ bool Is64Bit = (Triple.getArch() == llvm::Triple::riscv64);
+ llvm::RISCV::CPUKind CPUKind = llvm::RISCV::parseCPUKind(Mcpu);
+ if (!llvm::RISCV::checkCPUKind(CPUKind, Is64Bit) ||
+ !llvm::RISCV::getCPUFeaturesExceptStdExt(CPUKind, Features)) {
+ D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
+ }
+}
+
void riscv::getRISCVTargetFeatures(const Driver &D, const llvm::Triple &Triple,
const ArgList &Args,
std::vector<StringRef> &Features) {
@@ -454,6 +467,11 @@ void riscv::getRISCVTargetFeatures(const Driver &D, co
if (!getArchFeatures(D, MArch, Features, Args))
return;
+ // If users give march and mcpu, get std extension feature from MArch
+ // and other features (ex. mirco architecture feature) from mcpu
+ if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
+ getRISCFeaturesFromMcpu(D, Triple, Args, A, A->getValue(), Features);
+
// Handle features corresponding to "-ffixed-X" options
if (Args.hasArg(options::OPT_ffixed_x1))
Features.push_back("+reserve-x1");
@@ -543,11 +561,9 @@ StringRef riscv::getRISCVABI(const ArgList &Args, cons
// GCC's logic around choosing a default `-mabi=` is complex. If GCC is not
// configured using `--with-abi=`, then the logic for the default choice is
- // defined in config.gcc. This function is based on the logic in GCC 9.2.0. We
- // deviate from GCC's default only on baremetal targets (UnknownOS) where
- // neither `-march` nor `-mabi` is specified.
+ // defined in config.gcc. This function is based on the logic in GCC 9.2.0.
//
- // The logic uses the following, in order:
+ // The logic used in GCC 9.2.0 is the following, in order:
// 1. Explicit choices using `--with-abi=`
// 2. A default based on `--with-arch=`, if provided
// 3. A default based on the target triple's arch
@@ -556,38 +572,40 @@ StringRef riscv::getRISCVABI(const ArgList &Args, cons
//
// Clang does not have `--with-arch=` or `--with-abi=`, so we use `-march=`
// and `-mabi=` respectively instead.
+ //
+ // In order to make chosing logic more clear, Clang uses the following logic,
+ // in order:
+ // 1. Explicit choices using `-mabi=`
+ // 2. A default based on the architecture as determined by getRISCVArch
+ // 3. Choose a default based on the triple
// 1. If `-mabi=` is specified, use it.
if (const Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
return A->getValue();
- // 2. Choose a default based on `-march=`
+ // 2. Choose a default based on the target architecture.
//
// rv32g | rv32*d -> ilp32d
// rv32e -> ilp32e
// rv32* -> ilp32
// rv64g | rv64*d -> lp64d
// rv64* -> lp64
- if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
- StringRef MArch = A->getValue();
+ StringRef MArch = getRISCVArch(Args, Triple);
- if (MArch.startswith_lower("rv32")) {
- // FIXME: parse `March` to find `D` extension properly
- if (MArch.substr(4).contains_lower("d") ||
- MArch.startswith_lower("rv32g"))
- return "ilp32d";
- else if (MArch.startswith_lower("rv32e"))
- return "ilp32e";
- else
- return "ilp32";
- } else if (MArch.startswith_lower("rv64")) {
- // FIXME: parse `March` to find `D` extension properly
- if (MArch.substr(4).contains_lower("d") ||
- MArch.startswith_lower("rv64g"))
- return "lp64d";
- else
- return "lp64";
- }
+ if (MArch.startswith_lower("rv32")) {
+ // FIXME: parse `March` to find `D` extension properly
+ if (MArch.substr(4).contains_lower("d") || MArch.startswith_lower("rv32g"))
+ return "ilp32d";
+ else if (MArch.startswith_lower("rv32e"))
+ return "ilp32e";
+ else
+ return "ilp32";
+ } else if (MArch.startswith_lower("rv64")) {
+ // FIXME: parse `March` to find `D` extension properly
+ if (MArch.substr(4).contains_lower("d") || MArch.startswith_lower("rv64g"))
+ return "lp64d";
+ else
+ return "lp64";
}
// 3. Choose a default based on the triple
@@ -617,10 +635,11 @@ StringRef riscv::getRISCVArch(const llvm::opt::ArgList
// GCC's logic around choosing a default `-march=` is complex. If GCC is not
// configured using `--with-arch=`, then the logic for the default choice is
// defined in config.gcc. This function is based on the logic in GCC 9.2.0. We
- // deviate from GCC's default only on baremetal targets (UnknownOS) where
- // neither `-march` nor `-mabi` is specified.
+ // deviate from GCC's default on additional `-mcpu` option (GCC does not
+ // support `-mcpu`) and baremetal targets (UnknownOS) where neither `-march`
+ // nor `-mabi` is specified.
//
- // The logic uses the following, in order:
+ // The logic used in GCC 9.2.0 is the following, in order:
// 1. Explicit choices using `--with-arch=`
// 2. A default based on `--with-abi=`, if provided
// 3. A default based on the target triple's arch
@@ -630,6 +649,12 @@ StringRef riscv::getRISCVArch(const llvm::opt::ArgList
// Clang does not have `--with-arch=` or `--with-abi=`, so we use `-march=`
// and `-mabi=` respectively instead.
//
+ // Clang uses the following logic, in order:
+ // 1. Explicit choices using `-march=`
+ // 2. Based on `-mcpu` if the target CPU has a default ISA string
+ // 3. A default based on `-mabi`, if provided
+ // 4. A default based on the target triple's arch
+ //
// Clang does not yet support MULTILIB_REUSE, so we use `rv{XLEN}imafdc`
// instead of `rv{XLEN}gc` though they are (currently) equivalent.
@@ -637,7 +662,15 @@ StringRef riscv::getRISCVArch(const llvm::opt::ArgList
if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
return A->getValue();
- // 2. Choose a default based on `-mabi=`
+ // 2. Get march (isa string) based on `-mcpu=`
+ if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
+ StringRef MArch = llvm::RISCV::getMArchFromMcpu(A->getValue());
+ // Bypass if target cpu's default march is empty.
+ if (MArch != "")
+ return MArch;
+ }
+
+ // 3. Choose a default based on `-mabi=`
//
// ilp32e -> rv32e
// ilp32 | ilp32f | ilp32d -> rv32imafdc
@@ -653,7 +686,7 @@ StringRef riscv::getRISCVArch(const llvm::opt::ArgList
return "rv64imafdc";
}
- // 3. Choose a default based on the triple
+ // 4. Choose a default based on the triple
//
// We deviate from GCC's defaults here:
// - On `riscv{XLEN}-unknown-elf` we default to `rv{XLEN}imac`
Modified: vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Clang.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Clang.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/Clang.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -5627,6 +5627,12 @@ void Clang::ConstructJob(Compilation &C, const JobActi
if (Args.hasFlag(options::OPT_fpch_instantiate_templates,
options::OPT_fno_pch_instantiate_templates, false))
CmdArgs.push_back("-fpch-instantiate-templates");
+ if (Args.hasFlag(options::OPT_fpch_codegen, options::OPT_fno_pch_codegen,
+ false))
+ CmdArgs.push_back("-fmodules-codegen");
+ if (Args.hasFlag(options::OPT_fpch_debuginfo, options::OPT_fno_pch_debuginfo,
+ false))
+ CmdArgs.push_back("-fmodules-debuginfo");
Args.AddLastArg(CmdArgs, options::OPT_fexperimental_new_pass_manager,
options::OPT_fno_experimental_new_pass_manager);
Modified: vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/CommonArgs.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/CommonArgs.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Driver/ToolChains/CommonArgs.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -333,6 +333,11 @@ std::string tools::getCPUName(const ArgList &Args, con
return TargetCPUName;
}
+ case llvm::Triple::riscv32:
+ case llvm::Triple::riscv64:
+ if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
+ return A->getValue();
+ return "";
case llvm::Triple::bpfel:
case llvm::Triple::bpfeb:
Modified: vendor/llvm-project/release-11.x/clang/lib/Driver/Types.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Driver/Types.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Driver/Types.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -141,7 +141,7 @@ bool types::isAcceptedByClang(ID Id) {
case TY_CXXHeader: case TY_PP_CXXHeader:
case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
case TY_CXXModule: case TY_PP_CXXModule:
- case TY_AST: case TY_ModuleFile:
+ case TY_AST: case TY_ModuleFile: case TY_PCH:
case TY_LLVM_IR: case TY_LLVM_BC:
return true;
}
Modified: vendor/llvm-project/release-11.x/clang/lib/Frontend/CompilerInvocation.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Frontend/CompilerInvocation.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Frontend/CompilerInvocation.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -2022,8 +2022,9 @@ static InputKind ParseFrontendArgs(FrontendOptions &Op
// FIXME: Supporting '<lang>-header-cpp-output' would be useful.
bool Preprocessed = XValue.consume_back("-cpp-output");
bool ModuleMap = XValue.consume_back("-module-map");
- IsHeaderFile =
- !Preprocessed && !ModuleMap && XValue.consume_back("-header");
+ IsHeaderFile = !Preprocessed && !ModuleMap &&
+ XValue != "precompiled-header" &&
+ XValue.consume_back("-header");
// Principal languages.
DashX = llvm::StringSwitch<InputKind>(XValue)
@@ -2050,7 +2051,7 @@ static InputKind ParseFrontendArgs(FrontendOptions &Op
DashX = llvm::StringSwitch<InputKind>(XValue)
.Case("cpp-output", InputKind(Language::C).getPreprocessed())
.Case("assembler-with-cpp", Language::Asm)
- .Cases("ast", "pcm",
+ .Cases("ast", "pcm", "precompiled-header",
InputKind(Language::Unknown, InputKind::Precompiled))
.Case("ir", Language::LLVM_IR)
.Default(Language::Unknown);
Modified: vendor/llvm-project/release-11.x/clang/lib/Sema/SemaExprCXX.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Sema/SemaExprCXX.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Sema/SemaExprCXX.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -7977,19 +7977,26 @@ class TransformTypos : public TreeTransform<TransformT
}
}
- /// If corrections for the first TypoExpr have been exhausted for a
- /// given combination of the other TypoExprs, retry those corrections against
- /// the next combination of substitutions for the other TypoExprs by advancing
- /// to the next potential correction of the second TypoExpr. For the second
- /// and subsequent TypoExprs, if its stream of corrections has been exhausted,
- /// the stream is reset and the next TypoExpr's stream is advanced by one (a
- /// TypoExpr's correction stream is advanced by removing the TypoExpr from the
- /// TransformCache). Returns true if there is still any untried combinations
- /// of corrections.
+ /// Try to advance the typo correction state of the first unfinished TypoExpr.
+ /// We allow advancement of the correction stream by removing it from the
+ /// TransformCache which allows `TransformTypoExpr` to advance during the
+ /// next transformation attempt.
+ ///
+ /// Any substitution attempts for the previous TypoExprs (which must have been
+ /// finished) will need to be retried since it's possible that they will now
+ /// be invalid given the latest advancement.
+ ///
+ /// We need to be sure that we're making progress - it's possible that the
+ /// tree is so malformed that the transform never makes it to the
+ /// `TransformTypoExpr`.
+ ///
+ /// Returns true if there are any untried correction combinations.
bool CheckAndAdvanceTypoExprCorrectionStreams() {
for (auto TE : TypoExprs) {
auto &State = SemaRef.getTypoExprState(TE);
TransformCache.erase(TE);
+ if (!State.Consumer->hasMadeAnyCorrectionProgress())
+ return false;
if (!State.Consumer->finished())
return true;
State.Consumer->resetCorrectionStream();
Modified: vendor/llvm-project/release-11.x/clang/lib/Sema/SemaOpenMP.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/clang/lib/Sema/SemaOpenMP.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/clang/lib/Sema/SemaOpenMP.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -15153,6 +15153,7 @@ static bool actOnOMPReductionKindClause(
auto *DRDRef = DeclareReductionRef.getAs<DeclRefExpr>();
auto *DRD = cast<OMPDeclareReductionDecl>(DRDRef->getDecl());
if (DRD->getInitializer()) {
+ S.ActOnUninitializedDecl(PrivateVD);
Init = DRDRef;
RHSVD->setInit(DRDRef);
RHSVD->setInitStyle(VarDecl::CallInit);
@@ -15259,10 +15260,19 @@ static bool actOnOMPReductionKindClause(
llvm_unreachable("Unexpected reduction operation");
}
}
- if (Init && DeclareReductionRef.isUnset())
+ if (Init && DeclareReductionRef.isUnset()) {
S.AddInitializerToDecl(RHSVD, Init, /*DirectInit=*/false);
- else if (!Init)
+ // Store initializer for single element in private copy. Will be used
+ // during codegen.
+ PrivateVD->setInit(RHSVD->getInit());
+ PrivateVD->setInitStyle(RHSVD->getInitStyle());
+ } else if (!Init) {
S.ActOnUninitializedDecl(RHSVD);
+ // Store initializer for single element in private copy. Will be used
+ // during codegen.
+ PrivateVD->setInit(RHSVD->getInit());
+ PrivateVD->setInitStyle(RHSVD->getInitStyle());
+ }
if (RHSVD->isInvalidDecl())
continue;
if (!RHSVD->hasInit() &&
@@ -15276,10 +15286,6 @@ static bool actOnOMPReductionKindClause(
<< D;
continue;
}
- // Store initializer for single element in private copy. Will be used during
- // codegen.
- PrivateVD->setInit(RHSVD->getInit());
- PrivateVD->setInitStyle(RHSVD->getInitStyle());
DeclRefExpr *PrivateDRE = buildDeclRefExpr(S, PrivateVD, PrivateTy, ELoc);
ExprResult ReductionOp;
if (DeclareReductionRef.isUsable()) {
Modified: vendor/llvm-project/release-11.x/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/compiler-rt/lib/tsan/rtl/tsan_rtl_report.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -439,65 +439,61 @@ void RestoreStack(int tid, const u64 epoch, VarSizeSta
ExtractTagFromStack(stk, tag);
}
-static bool HandleRacyStacks(ThreadState *thr, VarSizeStackTrace traces[2],
- uptr addr_min, uptr addr_max) {
- bool equal_stack = false;
+static bool FindRacyStacks(const RacyStacks &hash) {
+ for (uptr i = 0; i < ctx->racy_stacks.Size(); i++) {
+ if (hash == ctx->racy_stacks[i]) {
+ VPrintf(2, "ThreadSanitizer: suppressing report as doubled (stack)\n");
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool HandleRacyStacks(ThreadState *thr, VarSizeStackTrace traces[2]) {
+ if (!flags()->suppress_equal_stacks)
+ return false;
RacyStacks hash;
- bool equal_address = false;
- RacyAddress ra0 = {addr_min, addr_max};
+ hash.hash[0] = md5_hash(traces[0].trace, traces[0].size * sizeof(uptr));
+ hash.hash[1] = md5_hash(traces[1].trace, traces[1].size * sizeof(uptr));
{
ReadLock lock(&ctx->racy_mtx);
- if (flags()->suppress_equal_stacks) {
- hash.hash[0] = md5_hash(traces[0].trace, traces[0].size * sizeof(uptr));
- hash.hash[1] = md5_hash(traces[1].trace, traces[1].size * sizeof(uptr));
- for (uptr i = 0; i < ctx->racy_stacks.Size(); i++) {
- if (hash == ctx->racy_stacks[i]) {
- VPrintf(2,
- "ThreadSanitizer: suppressing report as doubled (stack)\n");
- equal_stack = true;
- break;
- }
- }
+ if (FindRacyStacks(hash))
+ return true;
+ }
+ Lock lock(&ctx->racy_mtx);
+ if (FindRacyStacks(hash))
+ return true;
+ ctx->racy_stacks.PushBack(hash);
+ return false;
+}
+
+static bool FindRacyAddress(const RacyAddress &ra0) {
+ for (uptr i = 0; i < ctx->racy_addresses.Size(); i++) {
+ RacyAddress ra2 = ctx->racy_addresses[i];
+ uptr maxbeg = max(ra0.addr_min, ra2.addr_min);
+ uptr minend = min(ra0.addr_max, ra2.addr_max);
+ if (maxbeg < minend) {
+ VPrintf(2, "ThreadSanitizer: suppressing report as doubled (addr)\n");
+ return true;
}
- if (flags()->suppress_equal_addresses) {
- for (uptr i = 0; i < ctx->racy_addresses.Size(); i++) {
- RacyAddress ra2 = ctx->racy_addresses[i];
- uptr maxbeg = max(ra0.addr_min, ra2.addr_min);
- uptr minend = min(ra0.addr_max, ra2.addr_max);
- if (maxbeg < minend) {
- VPrintf(2, "ThreadSanitizer: suppressing report as doubled (addr)\n");
- equal_address = true;
- break;
- }
- }
- }
}
- if (!equal_stack && !equal_address)
- return false;
- if (!equal_stack) {
- Lock lock(&ctx->racy_mtx);
- ctx->racy_stacks.PushBack(hash);
- }
- if (!equal_address) {
- Lock lock(&ctx->racy_mtx);
- ctx->racy_addresses.PushBack(ra0);
- }
- return true;
+ return false;
}
-static void AddRacyStacks(ThreadState *thr, VarSizeStackTrace traces[2],
- uptr addr_min, uptr addr_max) {
- Lock lock(&ctx->racy_mtx);
- if (flags()->suppress_equal_stacks) {
- RacyStacks hash;
- hash.hash[0] = md5_hash(traces[0].trace, traces[0].size * sizeof(uptr));
- hash.hash[1] = md5_hash(traces[1].trace, traces[1].size * sizeof(uptr));
- ctx->racy_stacks.PushBack(hash);
+static bool HandleRacyAddress(ThreadState *thr, uptr addr_min, uptr addr_max) {
+ if (!flags()->suppress_equal_addresses)
+ return false;
+ RacyAddress ra0 = {addr_min, addr_max};
+ {
+ ReadLock lock(&ctx->racy_mtx);
+ if (FindRacyAddress(ra0))
+ return true;
}
- if (flags()->suppress_equal_addresses) {
- RacyAddress ra0 = {addr_min, addr_max};
- ctx->racy_addresses.PushBack(ra0);
- }
+ Lock lock(&ctx->racy_mtx);
+ if (FindRacyAddress(ra0))
+ return true;
+ ctx->racy_addresses.PushBack(ra0);
+ return false;
}
bool OutputReport(ThreadState *thr, const ScopedReport &srep) {
@@ -618,6 +614,8 @@ void ReportRace(ThreadState *thr) {
if (IsExpectedReport(addr_min, addr_max - addr_min))
return;
}
+ if (HandleRacyAddress(thr, addr_min, addr_max))
+ return;
ReportType typ = ReportTypeRace;
if (thr->is_vptr_access && freed)
@@ -668,7 +666,7 @@ void ReportRace(ThreadState *thr) {
if (IsFiredSuppression(ctx, typ, traces[1]))
return;
- if (HandleRacyStacks(thr, traces, addr_min, addr_max))
+ if (HandleRacyStacks(thr, traces))
return;
// If any of the accesses has a tag, treat this as an "external" race.
@@ -711,7 +709,6 @@ void ReportRace(ThreadState *thr) {
if (!OutputReport(thr, rep))
return;
- AddRacyStacks(thr, traces, addr_min, addr_max);
}
void PrintCurrentStack(ThreadState *thr, uptr pc) {
Modified: vendor/llvm-project/release-11.x/lld/COFF/SymbolTable.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/lld/COFF/SymbolTable.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/lld/COFF/SymbolTable.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -136,12 +136,16 @@ getFileLine(const SectionChunk *c, uint32_t addr) {
// of all references to that symbol from that file. If no debug information is
// available, returns just the name of the file, else one string per actual
// reference as described in the debug info.
-std::vector<std::string> getSymbolLocations(ObjFile *file, uint32_t symIndex) {
+// Returns up to maxStrings string descriptions, along with the total number of
+// locations found.
+static std::pair<std::vector<std::string>, size_t>
+getSymbolLocations(ObjFile *file, uint32_t symIndex, size_t maxStrings) {
struct Location {
Symbol *sym;
std::pair<StringRef, uint32_t> fileLine;
};
std::vector<Location> locations;
+ size_t numLocations = 0;
for (Chunk *c : file->getChunks()) {
auto *sc = dyn_cast<SectionChunk>(c);
@@ -150,6 +154,10 @@ std::vector<std::string> getSymbolLocations(ObjFile *f
for (const coff_relocation &r : sc->getRelocs()) {
if (r.SymbolTableIndex != symIndex)
continue;
+ numLocations++;
+ if (locations.size() >= maxStrings)
+ continue;
+
Optional<std::pair<StringRef, uint32_t>> fileLine =
getFileLine(sc, r.VirtualAddress);
Symbol *sym = getSymbol(sc, r.VirtualAddress);
@@ -160,9 +168,13 @@ std::vector<std::string> getSymbolLocations(ObjFile *f
}
}
- if (locations.empty())
- return std::vector<std::string>({"\n>>> referenced by " + toString(file)});
+ if (maxStrings == 0)
+ return std::make_pair(std::vector<std::string>(), numLocations);
+ if (numLocations == 0)
+ return std::make_pair(
+ std::vector<std::string>{"\n>>> referenced by " + toString(file)}, 1);
+
std::vector<std::string> symbolLocations(locations.size());
size_t i = 0;
for (Location loc : locations) {
@@ -175,17 +187,26 @@ std::vector<std::string> getSymbolLocations(ObjFile *f
if (loc.sym)
os << ":(" << toString(*loc.sym) << ')';
}
- return symbolLocations;
+ return std::make_pair(symbolLocations, numLocations);
}
-std::vector<std::string> getSymbolLocations(InputFile *file,
- uint32_t symIndex) {
+std::vector<std::string> getSymbolLocations(ObjFile *file, uint32_t symIndex) {
+ return getSymbolLocations(file, symIndex, SIZE_MAX).first;
+}
+
+static std::pair<std::vector<std::string>, size_t>
+getSymbolLocations(InputFile *file, uint32_t symIndex, size_t maxStrings) {
if (auto *o = dyn_cast<ObjFile>(file))
- return getSymbolLocations(o, symIndex);
- if (auto *b = dyn_cast<BitcodeFile>(file))
- return getSymbolLocations(b);
+ return getSymbolLocations(o, symIndex, maxStrings);
+ if (auto *b = dyn_cast<BitcodeFile>(file)) {
+ std::vector<std::string> symbolLocations = getSymbolLocations(b);
+ size_t numLocations = symbolLocations.size();
+ if (symbolLocations.size() > maxStrings)
+ symbolLocations.resize(maxStrings);
+ return std::make_pair(symbolLocations, numLocations);
+ }
llvm_unreachable("unsupported file type passed to getSymbolLocations");
- return {};
+ return std::make_pair(std::vector<std::string>(), (size_t)0);
}
// For an undefined symbol, stores all files referencing it and the index of
@@ -205,20 +226,21 @@ static void reportUndefinedSymbol(const UndefinedDiag
os << "undefined symbol: " << toString(*undefDiag.sym);
const size_t maxUndefReferences = 3;
- size_t i = 0, numRefs = 0;
+ size_t numDisplayedRefs = 0, numRefs = 0;
for (const UndefinedDiag::File &ref : undefDiag.files) {
- std::vector<std::string> symbolLocations =
- getSymbolLocations(ref.file, ref.symIndex);
- numRefs += symbolLocations.size();
+ std::vector<std::string> symbolLocations;
+ size_t totalLocations = 0;
+ std::tie(symbolLocations, totalLocations) = getSymbolLocations(
+ ref.file, ref.symIndex, maxUndefReferences - numDisplayedRefs);
+
+ numRefs += totalLocations;
+ numDisplayedRefs += symbolLocations.size();
for (const std::string &s : symbolLocations) {
- if (i >= maxUndefReferences)
- break;
os << s;
- i++;
}
}
- if (i < numRefs)
- os << "\n>>> referenced " << numRefs - i << " more times";
+ if (numDisplayedRefs < numRefs)
+ os << "\n>>> referenced " << numRefs - numDisplayedRefs << " more times";
errorOrWarn(os.str());
}
Modified: vendor/llvm-project/release-11.x/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -1036,18 +1036,20 @@ bool SymbolFileDWARF::ParseLineTable(CompileUnit &comp
// FIXME: Rather than parsing the whole line table and then copying it over
// into LLDB, we should explore using a callback to populate the line table
// while we parse to reduce memory usage.
- std::unique_ptr<LineSequence> sequence =
- LineTable::CreateLineSequenceContainer();
std::vector<std::unique_ptr<LineSequence>> sequences;
- for (auto &row : line_table->Rows) {
- LineTable::AppendLineEntryToSequence(
- sequence.get(), row.Address.Address, row.Line, row.Column, row.File,
- row.IsStmt, row.BasicBlock, row.PrologueEnd, row.EpilogueBegin,
- row.EndSequence);
- if (row.EndSequence) {
- sequences.push_back(std::move(sequence));
- sequence = LineTable::CreateLineSequenceContainer();
+ // The Sequences view contains only valid line sequences. Don't iterate over
+ // the Rows directly.
+ for (const llvm::DWARFDebugLine::Sequence &seq : line_table->Sequences) {
+ std::unique_ptr<LineSequence> sequence =
+ LineTable::CreateLineSequenceContainer();
+ for (unsigned idx = seq.FirstRowIndex; idx < seq.LastRowIndex; ++idx) {
+ const llvm::DWARFDebugLine::Row &row = line_table->Rows[idx];
+ LineTable::AppendLineEntryToSequence(
+ sequence.get(), row.Address.Address, row.Line, row.Column, row.File,
+ row.IsStmt, row.BasicBlock, row.PrologueEnd, row.EpilogueBegin,
+ row.EndSequence);
}
+ sequences.push_back(std::move(sequence));
}
std::unique_ptr<LineTable> line_table_up =
Modified: vendor/llvm-project/release-11.x/llvm/include/llvm/IR/IRBuilder.h
==============================================================================
--- vendor/llvm-project/release-11.x/llvm/include/llvm/IR/IRBuilder.h Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/llvm/include/llvm/IR/IRBuilder.h Sun Jul 26 19:46:28 2020 (r363581)
@@ -782,11 +782,7 @@ class IRBuilderBase { (public)
/// Create an assume intrinsic call that allows the optimizer to
/// assume that the provided condition will be true.
- ///
- /// The optional argument \p OpBundles specifies operand bundles that are
- /// added to the call instruction.
- CallInst *CreateAssumption(Value *Cond,
- ArrayRef<OperandBundleDef> OpBundles = llvm::None);
+ CallInst *CreateAssumption(Value *Cond);
/// Create a call to the experimental.gc.statepoint intrinsic to
/// start a new statepoint sequence.
@@ -2506,11 +2502,13 @@ class IRBuilderBase { (public)
private:
/// Helper function that creates an assume intrinsic call that
- /// represents an alignment assumption on the provided pointer \p PtrValue
- /// with offset \p OffsetValue and alignment value \p AlignValue.
+ /// represents an alignment assumption on the provided Ptr, Mask, Type
+ /// and Offset. It may be sometimes useful to do some other logic
+ /// based on this alignment check, thus it can be stored into 'TheCheck'.
CallInst *CreateAlignmentAssumptionHelper(const DataLayout &DL,
- Value *PtrValue, Value *AlignValue,
- Value *OffsetValue);
+ Value *PtrValue, Value *Mask,
+ Type *IntPtrTy, Value *OffsetValue,
+ Value **TheCheck);
public:
/// Create an assume intrinsic call that represents an alignment
@@ -2519,9 +2517,13 @@ class IRBuilderBase { (public)
/// An optional offset can be provided, and if it is provided, the offset
/// must be subtracted from the provided pointer to get the pointer with the
/// specified alignment.
+ ///
+ /// It may be sometimes useful to do some other logic
+ /// based on this alignment check, thus it can be stored into 'TheCheck'.
CallInst *CreateAlignmentAssumption(const DataLayout &DL, Value *PtrValue,
unsigned Alignment,
- Value *OffsetValue = nullptr);
+ Value *OffsetValue = nullptr,
+ Value **TheCheck = nullptr);
/// Create an assume intrinsic call that represents an alignment
/// assumption on the provided pointer.
@@ -2530,11 +2532,15 @@ class IRBuilderBase { (public)
/// must be subtracted from the provided pointer to get the pointer with the
/// specified alignment.
///
+ /// It may be sometimes useful to do some other logic
+ /// based on this alignment check, thus it can be stored into 'TheCheck'.
+ ///
/// This overload handles the condition where the Alignment is dependent
/// on an existing value rather than a static value.
CallInst *CreateAlignmentAssumption(const DataLayout &DL, Value *PtrValue,
Value *Alignment,
- Value *OffsetValue = nullptr);
+ Value *OffsetValue = nullptr,
+ Value **TheCheck = nullptr);
};
/// This provides a uniform API for creating instructions and inserting
Added: vendor/llvm-project/release-11.x/llvm/include/llvm/Support/RISCVTargetParser.def
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ vendor/llvm-project/release-11.x/llvm/include/llvm/Support/RISCVTargetParser.def Sun Jul 26 19:46:28 2020 (r363581)
@@ -0,0 +1,13 @@
+#ifndef PROC
+#define PROC(ENUM, NAME, FEATURES, DEFAULT_MARCH)
+#endif
+
+PROC(INVALID, {"invalid"}, FK_INVALID, {""})
+PROC(GENERIC_RV32, {"generic-rv32"}, FK_NONE, {""})
+PROC(GENERIC_RV64, {"generic-rv64"}, FK_64BIT, {""})
+PROC(ROCKET_RV32, {"rocket-rv32"}, FK_NONE, {""})
+PROC(ROCKET_RV64, {"rocket-rv64"}, FK_64BIT, {""})
+PROC(SIFIVE_E31, {"sifive-e31"}, FK_NONE, {"rv32imac"})
+PROC(SIFIVE_U54, {"sifive-u54"}, FK_64BIT, {"rv64gc"})
+
+#undef PROC
Modified: vendor/llvm-project/release-11.x/llvm/include/llvm/Support/TargetParser.h
==============================================================================
--- vendor/llvm-project/release-11.x/llvm/include/llvm/Support/TargetParser.h Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/llvm/include/llvm/Support/TargetParser.h Sun Jul 26 19:46:28 2020 (r363581)
@@ -130,6 +130,32 @@ IsaVersion getIsaVersion(StringRef GPU);
} // namespace AMDGPU
+namespace RISCV {
+
+enum CPUKind : unsigned {
+#define PROC(ENUM, NAME, FEATURES, DEFAULT_MARCH) CK_##ENUM,
+#include "RISCVTargetParser.def"
+};
+
+enum FeatureKind : unsigned {
+ FK_INVALID = 0,
+ FK_NONE = 1,
+ FK_STDEXTM = 1 << 2,
+ FK_STDEXTA = 1 << 3,
+ FK_STDEXTF = 1 << 4,
+ FK_STDEXTD = 1 << 5,
+ FK_STDEXTC = 1 << 6,
+ FK_64BIT = 1 << 7,
+};
+
+bool checkCPUKind(CPUKind Kind, bool IsRV64);
+CPUKind parseCPUKind(StringRef CPU);
+StringRef getMArchFromMcpu(StringRef CPU);
+void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
+bool getCPUFeaturesExceptStdExt(CPUKind Kind, std::vector<StringRef> &Features);
+
+} // namespace RISCV
+
} // namespace llvm
#endif
Modified: vendor/llvm-project/release-11.x/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h
==============================================================================
--- vendor/llvm-project/release-11.x/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h Sun Jul 26 19:46:28 2020 (r363581)
@@ -37,9 +37,9 @@ struct AlignmentFromAssumptionsPass
ScalarEvolution *SE = nullptr;
DominatorTree *DT = nullptr;
- bool extractAlignmentInfo(CallInst *I, unsigned Idx, Value *&AAPtr,
- const SCEV *&AlignSCEV, const SCEV *&OffSCEV);
- bool processAssumption(CallInst *I, unsigned Idx);
+ bool extractAlignmentInfo(CallInst *I, Value *&AAPtr, const SCEV *&AlignSCEV,
+ const SCEV *&OffSCEV);
+ bool processAssumption(CallInst *I);
};
}
Modified: vendor/llvm-project/release-11.x/llvm/lib/Analysis/AssumeBundleQueries.cpp
==============================================================================
--- vendor/llvm-project/release-11.x/llvm/lib/Analysis/AssumeBundleQueries.cpp Sun Jul 26 19:40:37 2020 (r363580)
+++ vendor/llvm-project/release-11.x/llvm/lib/Analysis/AssumeBundleQueries.cpp Sun Jul 26 19:46:28 2020 (r363581)
@@ -108,17 +108,10 @@ llvm::getKnowledgeFromBundle(CallInst &Assume,
Result.AttrKind = Attribute::getAttrKindFromName(BOI.Tag->getKey());
if (bundleHasArgument(BOI, ABA_WasOn))
Result.WasOn = getValueFromBundleOpInfo(Assume, BOI, ABA_WasOn);
- auto GetArgOr1 = [&](unsigned Idx) -> unsigned {
- if (auto *ConstInt = dyn_cast<ConstantInt>(
- getValueFromBundleOpInfo(Assume, BOI, ABA_Argument + Idx)))
- return ConstInt->getZExtValue();
- return 1;
- };
if (BOI.End - BOI.Begin > ABA_Argument)
- Result.ArgValue = GetArgOr1(0);
- if (Result.AttrKind == Attribute::Alignment)
- if (BOI.End - BOI.Begin > ABA_Argument + 1)
- Result.ArgValue = MinAlign(Result.ArgValue, GetArgOr1(1));
+ Result.ArgValue =
+ cast<ConstantInt>(getValueFromBundleOpInfo(Assume, BOI, ABA_Argument))
+ ->getZExtValue();
return Result;
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-vendor
mailing list