Upgrade our copies of clang, llvm, lld and libc++ to r311219 from the
upstream release_50 branch. MFC after: 2 months X-MFC-with: r321369
This commit is contained in:
commit
0554abf0e0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=322740
@ -556,6 +556,8 @@ template<class _CharT, class _Traits, class _Allocator>
|
|||||||
basic_string<_CharT, _Traits, _Allocator>
|
basic_string<_CharT, _Traits, _Allocator>
|
||||||
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
|
operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);
|
||||||
|
|
||||||
|
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
|
||||||
|
|
||||||
template <bool>
|
template <bool>
|
||||||
class _LIBCPP_TEMPLATE_VIS __basic_string_common
|
class _LIBCPP_TEMPLATE_VIS __basic_string_common
|
||||||
{
|
{
|
||||||
@ -3999,7 +4001,6 @@ basic_string<_CharT, _Traits, _Allocator>::__subscriptable(const const_iterator*
|
|||||||
|
|
||||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<char>)
|
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<char>)
|
||||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<wchar_t>)
|
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_string<wchar_t>)
|
||||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))
|
|
||||||
|
|
||||||
#if _LIBCPP_STD_VER > 11
|
#if _LIBCPP_STD_VER > 11
|
||||||
// Literal suffixes for basic_string [basic.string.literals]
|
// Literal suffixes for basic_string [basic.string.literals]
|
||||||
|
@ -1220,8 +1220,9 @@ class SelectionDAG {
|
|||||||
/// If an existing load has uses of its chain, create a token factor node with
|
/// If an existing load has uses of its chain, create a token factor node with
|
||||||
/// that chain and the new memory node's chain and update users of the old
|
/// that chain and the new memory node's chain and update users of the old
|
||||||
/// chain to the token factor. This ensures that the new memory node will have
|
/// chain to the token factor. This ensures that the new memory node will have
|
||||||
/// the same relative memory dependency position as the old load.
|
/// the same relative memory dependency position as the old load. Returns the
|
||||||
void makeEquivalentMemoryOrdering(LoadSDNode *Old, SDValue New);
|
/// new merged load chain.
|
||||||
|
SDValue makeEquivalentMemoryOrdering(LoadSDNode *Old, SDValue New);
|
||||||
|
|
||||||
/// Topological-sort the AllNodes list and a
|
/// Topological-sort the AllNodes list and a
|
||||||
/// assign a unique node id for each node in the DAG based on their
|
/// assign a unique node id for each node in the DAG based on their
|
||||||
|
@ -94,9 +94,9 @@ template <typename BaseLayerT> class LazyEmittingLayer {
|
|||||||
llvm_unreachable("Invalid emit-state.");
|
llvm_unreachable("Invalid emit-state.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeModuleFromBaseLayer(BaseLayerT &BaseLayer) {
|
Error removeModuleFromBaseLayer(BaseLayerT& BaseLayer) {
|
||||||
if (EmitState != NotEmitted)
|
return EmitState != NotEmitted ? BaseLayer.removeModule(Handle)
|
||||||
BaseLayer.removeModule(Handle);
|
: Error::success();
|
||||||
}
|
}
|
||||||
|
|
||||||
void emitAndFinalize(BaseLayerT &BaseLayer) {
|
void emitAndFinalize(BaseLayerT &BaseLayer) {
|
||||||
@ -226,9 +226,9 @@ template <typename BaseLayerT> class LazyEmittingLayer {
|
|||||||
/// This method will free the memory associated with the given module, both
|
/// This method will free the memory associated with the given module, both
|
||||||
/// in this layer, and the base layer.
|
/// in this layer, and the base layer.
|
||||||
Error removeModule(ModuleHandleT H) {
|
Error removeModule(ModuleHandleT H) {
|
||||||
(*H)->removeModuleFromBaseLayer(BaseLayer);
|
Error Err = (*H)->removeModuleFromBaseLayer(BaseLayer);
|
||||||
ModuleList.erase(H);
|
ModuleList.erase(H);
|
||||||
return Error::success();
|
return Err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Search for the given named symbol.
|
/// @brief Search for the given named symbol.
|
||||||
|
@ -73,6 +73,7 @@ class COFFImportFile : public SymbolicFile {
|
|||||||
struct COFFShortExport {
|
struct COFFShortExport {
|
||||||
std::string Name;
|
std::string Name;
|
||||||
std::string ExtName;
|
std::string ExtName;
|
||||||
|
std::string SymbolName;
|
||||||
|
|
||||||
uint16_t Ordinal = 0;
|
uint16_t Ordinal = 0;
|
||||||
bool Noname = false;
|
bool Noname = false;
|
||||||
@ -98,7 +99,8 @@ struct COFFShortExport {
|
|||||||
std::error_code writeImportLibrary(StringRef ImportName,
|
std::error_code writeImportLibrary(StringRef ImportName,
|
||||||
StringRef Path,
|
StringRef Path,
|
||||||
ArrayRef<COFFShortExport> Exports,
|
ArrayRef<COFFShortExport> Exports,
|
||||||
COFF::MachineTypes Machine);
|
COFF::MachineTypes Machine,
|
||||||
|
bool MakeWeakAliases);
|
||||||
|
|
||||||
} // namespace object
|
} // namespace object
|
||||||
} // namespace llvm
|
} // namespace llvm
|
||||||
|
@ -162,6 +162,11 @@ static cl::opt<unsigned>
|
|||||||
cl::desc("Maximum depth of recursive SExt/ZExt"),
|
cl::desc("Maximum depth of recursive SExt/ZExt"),
|
||||||
cl::init(8));
|
cl::init(8));
|
||||||
|
|
||||||
|
static cl::opt<unsigned>
|
||||||
|
MaxAddRecSize("scalar-evolution-max-add-rec-size", cl::Hidden,
|
||||||
|
cl::desc("Max coefficients in AddRec during evolving"),
|
||||||
|
cl::init(16));
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// SCEV class definitions
|
// SCEV class definitions
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -2878,6 +2883,12 @@ const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops,
|
|||||||
if (!OtherAddRec || OtherAddRec->getLoop() != AddRecLoop)
|
if (!OtherAddRec || OtherAddRec->getLoop() != AddRecLoop)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// Limit max number of arguments to avoid creation of unreasonably big
|
||||||
|
// SCEVAddRecs with very complex operands.
|
||||||
|
if (AddRec->getNumOperands() + OtherAddRec->getNumOperands() - 1 >
|
||||||
|
MaxAddRecSize)
|
||||||
|
continue;
|
||||||
|
|
||||||
bool Overflow = false;
|
bool Overflow = false;
|
||||||
Type *Ty = AddRec->getType();
|
Type *Ty = AddRec->getType();
|
||||||
bool LargerThan64Bits = getTypeSizeInBits(Ty) > 64;
|
bool LargerThan64Bits = getTypeSizeInBits(Ty) > 64;
|
||||||
@ -7582,6 +7593,25 @@ const SCEV *ScalarEvolution::computeSCEVAtScope(const SCEV *V, const Loop *L) {
|
|||||||
const SCEV *BackedgeTakenCount = getBackedgeTakenCount(LI);
|
const SCEV *BackedgeTakenCount = getBackedgeTakenCount(LI);
|
||||||
if (const SCEVConstant *BTCC =
|
if (const SCEVConstant *BTCC =
|
||||||
dyn_cast<SCEVConstant>(BackedgeTakenCount)) {
|
dyn_cast<SCEVConstant>(BackedgeTakenCount)) {
|
||||||
|
|
||||||
|
// This trivial case can show up in some degenerate cases where
|
||||||
|
// the incoming IR has not yet been fully simplified.
|
||||||
|
if (BTCC->getValue()->isZero()) {
|
||||||
|
Value *InitValue = nullptr;
|
||||||
|
bool MultipleInitValues = false;
|
||||||
|
for (unsigned i = 0; i < PN->getNumIncomingValues(); i++) {
|
||||||
|
if (!LI->contains(PN->getIncomingBlock(i))) {
|
||||||
|
if (!InitValue)
|
||||||
|
InitValue = PN->getIncomingValue(i);
|
||||||
|
else if (InitValue != PN->getIncomingValue(i)) {
|
||||||
|
MultipleInitValues = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!MultipleInitValues && InitValue)
|
||||||
|
return getSCEV(InitValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
// Okay, we know how many times the containing loop executes. If
|
// Okay, we know how many times the containing loop executes. If
|
||||||
// this is a constant evolving PHI node, get the final value at
|
// this is a constant evolving PHI node, get the final value at
|
||||||
// the specified iteration number.
|
// the specified iteration number.
|
||||||
|
@ -4458,6 +4458,10 @@ Optional<bool> llvm::isImpliedCondition(const Value *LHS, const Value *RHS,
|
|||||||
unsigned Depth, AssumptionCache *AC,
|
unsigned Depth, AssumptionCache *AC,
|
||||||
const Instruction *CxtI,
|
const Instruction *CxtI,
|
||||||
const DominatorTree *DT) {
|
const DominatorTree *DT) {
|
||||||
|
// Bail out when we hit the limit.
|
||||||
|
if (Depth == MaxDepth)
|
||||||
|
return None;
|
||||||
|
|
||||||
// A mismatch occurs when we compare a scalar cmp to a vector cmp, for example.
|
// A mismatch occurs when we compare a scalar cmp to a vector cmp, for example.
|
||||||
if (LHS->getType() != RHS->getType())
|
if (LHS->getType() != RHS->getType())
|
||||||
return None;
|
return None;
|
||||||
|
@ -302,7 +302,21 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SDValue DAGTypeLegalizer::ScalarizeVecRes_VSELECT(SDNode *N) {
|
SDValue DAGTypeLegalizer::ScalarizeVecRes_VSELECT(SDNode *N) {
|
||||||
SDValue Cond = GetScalarizedVector(N->getOperand(0));
|
SDValue Cond = N->getOperand(0);
|
||||||
|
EVT OpVT = Cond.getValueType();
|
||||||
|
SDLoc DL(N);
|
||||||
|
// The vselect result and true/value operands needs scalarizing, but it's
|
||||||
|
// not a given that the Cond does. For instance, in AVX512 v1i1 is legal.
|
||||||
|
// See the similar logic in ScalarizeVecRes_VSETCC
|
||||||
|
if (getTypeAction(OpVT) == TargetLowering::TypeScalarizeVector) {
|
||||||
|
Cond = GetScalarizedVector(Cond);
|
||||||
|
} else {
|
||||||
|
EVT VT = OpVT.getVectorElementType();
|
||||||
|
Cond = DAG.getNode(
|
||||||
|
ISD::EXTRACT_VECTOR_ELT, DL, VT, Cond,
|
||||||
|
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||||
|
}
|
||||||
|
|
||||||
SDValue LHS = GetScalarizedVector(N->getOperand(1));
|
SDValue LHS = GetScalarizedVector(N->getOperand(1));
|
||||||
TargetLowering::BooleanContent ScalarBool =
|
TargetLowering::BooleanContent ScalarBool =
|
||||||
TLI.getBooleanContents(false, false);
|
TLI.getBooleanContents(false, false);
|
||||||
|
@ -7262,22 +7262,23 @@ void SelectionDAG::TransferDbgValues(SDValue From, SDValue To) {
|
|||||||
AddDbgValue(I, ToNode, false);
|
AddDbgValue(I, ToNode, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionDAG::makeEquivalentMemoryOrdering(LoadSDNode *OldLoad,
|
SDValue SelectionDAG::makeEquivalentMemoryOrdering(LoadSDNode *OldLoad,
|
||||||
SDValue NewMemOp) {
|
SDValue NewMemOp) {
|
||||||
assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
|
assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
|
||||||
if (!OldLoad->hasAnyUseOfValue(1))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// The new memory operation must have the same position as the old load in
|
// The new memory operation must have the same position as the old load in
|
||||||
// terms of memory dependency. Create a TokenFactor for the old load and new
|
// terms of memory dependency. Create a TokenFactor for the old load and new
|
||||||
// memory operation and update uses of the old load's output chain to use that
|
// memory operation and update uses of the old load's output chain to use that
|
||||||
// TokenFactor.
|
// TokenFactor.
|
||||||
SDValue OldChain = SDValue(OldLoad, 1);
|
SDValue OldChain = SDValue(OldLoad, 1);
|
||||||
SDValue NewChain = SDValue(NewMemOp.getNode(), 1);
|
SDValue NewChain = SDValue(NewMemOp.getNode(), 1);
|
||||||
|
if (!OldLoad->hasAnyUseOfValue(1))
|
||||||
|
return NewChain;
|
||||||
|
|
||||||
SDValue TokenFactor =
|
SDValue TokenFactor =
|
||||||
getNode(ISD::TokenFactor, SDLoc(OldLoad), MVT::Other, OldChain, NewChain);
|
getNode(ISD::TokenFactor, SDLoc(OldLoad), MVT::Other, OldChain, NewChain);
|
||||||
ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
|
ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
|
||||||
UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewChain);
|
UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewChain);
|
||||||
|
return TokenFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
@ -180,6 +180,7 @@ class VirtRegRewriter : public MachineFunctionPass {
|
|||||||
void addLiveInsForSubRanges(const LiveInterval &LI, unsigned PhysReg) const;
|
void addLiveInsForSubRanges(const LiveInterval &LI, unsigned PhysReg) const;
|
||||||
void handleIdentityCopy(MachineInstr &MI) const;
|
void handleIdentityCopy(MachineInstr &MI) const;
|
||||||
void expandCopyBundle(MachineInstr &MI) const;
|
void expandCopyBundle(MachineInstr &MI) const;
|
||||||
|
bool subRegLiveThrough(const MachineInstr &MI, unsigned SuperPhysReg) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static char ID;
|
static char ID;
|
||||||
@ -415,6 +416,32 @@ void VirtRegRewriter::expandCopyBundle(MachineInstr &MI) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check whether (part of) \p SuperPhysReg is live through \p MI.
|
||||||
|
/// \pre \p MI defines a subregister of a virtual register that
|
||||||
|
/// has been assigned to \p SuperPhysReg.
|
||||||
|
bool VirtRegRewriter::subRegLiveThrough(const MachineInstr &MI,
|
||||||
|
unsigned SuperPhysReg) const {
|
||||||
|
SlotIndex MIIndex = LIS->getInstructionIndex(MI);
|
||||||
|
SlotIndex BeforeMIUses = MIIndex.getBaseIndex();
|
||||||
|
SlotIndex AfterMIDefs = MIIndex.getBoundaryIndex();
|
||||||
|
for (MCRegUnitIterator Unit(SuperPhysReg, TRI); Unit.isValid(); ++Unit) {
|
||||||
|
const LiveRange &UnitRange = LIS->getRegUnit(*Unit);
|
||||||
|
// If the regunit is live both before and after MI,
|
||||||
|
// we assume it is live through.
|
||||||
|
// Generally speaking, this is not true, because something like
|
||||||
|
// "RU = op RU" would match that description.
|
||||||
|
// However, we know that we are trying to assess whether
|
||||||
|
// a def of a virtual reg, vreg, is live at the same time of RU.
|
||||||
|
// If we are in the "RU = op RU" situation, that means that vreg
|
||||||
|
// is defined at the same time as RU (i.e., "vreg, RU = op RU").
|
||||||
|
// Thus, vreg and RU interferes and vreg cannot be assigned to
|
||||||
|
// SuperPhysReg. Therefore, this situation cannot happen.
|
||||||
|
if (UnitRange.liveAt(AfterMIDefs) && UnitRange.liveAt(BeforeMIUses))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void VirtRegRewriter::rewrite() {
|
void VirtRegRewriter::rewrite() {
|
||||||
bool NoSubRegLiveness = !MRI->subRegLivenessEnabled();
|
bool NoSubRegLiveness = !MRI->subRegLivenessEnabled();
|
||||||
SmallVector<unsigned, 8> SuperDeads;
|
SmallVector<unsigned, 8> SuperDeads;
|
||||||
@ -452,7 +479,8 @@ void VirtRegRewriter::rewrite() {
|
|||||||
// A virtual register kill refers to the whole register, so we may
|
// A virtual register kill refers to the whole register, so we may
|
||||||
// have to add <imp-use,kill> operands for the super-register. A
|
// have to add <imp-use,kill> operands for the super-register. A
|
||||||
// partial redef always kills and redefines the super-register.
|
// partial redef always kills and redefines the super-register.
|
||||||
if (MO.readsReg() && (MO.isDef() || MO.isKill()))
|
if ((MO.readsReg() && (MO.isDef() || MO.isKill())) ||
|
||||||
|
(MO.isDef() && subRegLiveThrough(*MI, PhysReg)))
|
||||||
SuperKills.push_back(PhysReg);
|
SuperKills.push_back(PhysReg);
|
||||||
|
|
||||||
if (MO.isDef()) {
|
if (MO.isDef()) {
|
||||||
|
@ -134,13 +134,13 @@ dumpDWARFv5StringOffsetsSection(raw_ostream &OS, StringRef SectionName,
|
|||||||
uint64_t StringOffset =
|
uint64_t StringOffset =
|
||||||
StrOffsetExt.getRelocatedValue(EntrySize, &Offset);
|
StrOffsetExt.getRelocatedValue(EntrySize, &Offset);
|
||||||
if (Format == DWARF32) {
|
if (Format == DWARF32) {
|
||||||
OS << format("%8.8x ", StringOffset);
|
|
||||||
uint32_t StringOffset32 = (uint32_t)StringOffset;
|
uint32_t StringOffset32 = (uint32_t)StringOffset;
|
||||||
|
OS << format("%8.8x ", StringOffset32);
|
||||||
const char *S = StrData.getCStr(&StringOffset32);
|
const char *S = StrData.getCStr(&StringOffset32);
|
||||||
if (S)
|
if (S)
|
||||||
OS << format("\"%s\"", S);
|
OS << format("\"%s\"", S);
|
||||||
} else
|
} else
|
||||||
OS << format("%16.16x ", StringOffset);
|
OS << format("%16.16" PRIx64 " ", StringOffset);
|
||||||
OS << "\n";
|
OS << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,7 @@ unsigned DWARFVerifier::verifyDebugInfoAttribute(const DWARFDie &Die,
|
|||||||
++NumErrors;
|
++NumErrors;
|
||||||
OS << "error: DW_AT_stmt_list offset is beyond .debug_line "
|
OS << "error: DW_AT_stmt_list offset is beyond .debug_line "
|
||||||
"bounds: "
|
"bounds: "
|
||||||
<< format("0x%08" PRIx32, *SectionOffset) << "\n";
|
<< format("0x%08" PRIx64, *SectionOffset) << "\n";
|
||||||
Die.dump(OS, 0);
|
Die.dump(OS, 0);
|
||||||
OS << "\n";
|
OS << "\n";
|
||||||
}
|
}
|
||||||
@ -234,7 +234,7 @@ unsigned DWARFVerifier::verifyDebugInfoForm(const DWARFDie &Die,
|
|||||||
if (CUOffset >= CUSize) {
|
if (CUOffset >= CUSize) {
|
||||||
++NumErrors;
|
++NumErrors;
|
||||||
OS << "error: " << FormEncodingString(Form) << " CU offset "
|
OS << "error: " << FormEncodingString(Form) << " CU offset "
|
||||||
<< format("0x%08" PRIx32, CUOffset)
|
<< format("0x%08" PRIx64, CUOffset)
|
||||||
<< " is invalid (must be less than CU size of "
|
<< " is invalid (must be less than CU size of "
|
||||||
<< format("0x%08" PRIx32, CUSize) << "):\n";
|
<< format("0x%08" PRIx32, CUSize) << "):\n";
|
||||||
Die.dump(OS, 0);
|
Die.dump(OS, 0);
|
||||||
@ -366,7 +366,7 @@ void DWARFVerifier::verifyDebugLineRows() {
|
|||||||
if (Row.Address < PrevAddress) {
|
if (Row.Address < PrevAddress) {
|
||||||
++NumDebugLineErrors;
|
++NumDebugLineErrors;
|
||||||
OS << "error: .debug_line["
|
OS << "error: .debug_line["
|
||||||
<< format("0x%08" PRIx32,
|
<< format("0x%08" PRIx64,
|
||||||
*toSectionOffset(Die.find(DW_AT_stmt_list)))
|
*toSectionOffset(Die.find(DW_AT_stmt_list)))
|
||||||
<< "] row[" << RowIndex
|
<< "] row[" << RowIndex
|
||||||
<< "] decreases in address from previous row:\n";
|
<< "] decreases in address from previous row:\n";
|
||||||
@ -381,7 +381,7 @@ void DWARFVerifier::verifyDebugLineRows() {
|
|||||||
if (Row.File > MaxFileIndex) {
|
if (Row.File > MaxFileIndex) {
|
||||||
++NumDebugLineErrors;
|
++NumDebugLineErrors;
|
||||||
OS << "error: .debug_line["
|
OS << "error: .debug_line["
|
||||||
<< format("0x%08" PRIx32,
|
<< format("0x%08" PRIx64,
|
||||||
*toSectionOffset(Die.find(DW_AT_stmt_list)))
|
*toSectionOffset(Die.find(DW_AT_stmt_list)))
|
||||||
<< "][" << RowIndex << "] has invalid file index " << Row.File
|
<< "][" << RowIndex << "] has invalid file index " << Row.File
|
||||||
<< " (valid values are [1," << MaxFileIndex << "]):\n";
|
<< " (valid values are [1," << MaxFileIndex << "]):\n";
|
||||||
|
@ -557,7 +557,7 @@ NewArchiveMember ObjectFactory::createWeakExternal(StringRef Sym,
|
|||||||
|
|
||||||
std::error_code writeImportLibrary(StringRef ImportName, StringRef Path,
|
std::error_code writeImportLibrary(StringRef ImportName, StringRef Path,
|
||||||
ArrayRef<COFFShortExport> Exports,
|
ArrayRef<COFFShortExport> Exports,
|
||||||
MachineTypes Machine) {
|
MachineTypes Machine, bool MakeWeakAliases) {
|
||||||
|
|
||||||
std::vector<NewArchiveMember> Members;
|
std::vector<NewArchiveMember> Members;
|
||||||
ObjectFactory OF(llvm::sys::path::filename(ImportName), Machine);
|
ObjectFactory OF(llvm::sys::path::filename(ImportName), Machine);
|
||||||
@ -575,7 +575,7 @@ std::error_code writeImportLibrary(StringRef ImportName, StringRef Path,
|
|||||||
if (E.Private)
|
if (E.Private)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (E.isWeak()) {
|
if (E.isWeak() && MakeWeakAliases) {
|
||||||
Members.push_back(OF.createWeakExternal(E.Name, E.ExtName, false));
|
Members.push_back(OF.createWeakExternal(E.Name, E.ExtName, false));
|
||||||
Members.push_back(OF.createWeakExternal(E.Name, E.ExtName, true));
|
Members.push_back(OF.createWeakExternal(E.Name, E.ExtName, true));
|
||||||
continue;
|
continue;
|
||||||
@ -587,7 +587,7 @@ std::error_code writeImportLibrary(StringRef ImportName, StringRef Path,
|
|||||||
if (E.Constant)
|
if (E.Constant)
|
||||||
ImportType = IMPORT_CONST;
|
ImportType = IMPORT_CONST;
|
||||||
|
|
||||||
StringRef SymbolName = E.isWeak() ? E.ExtName : E.Name;
|
StringRef SymbolName = E.SymbolName.empty() ? E.Name : E.SymbolName;
|
||||||
ImportNameType NameType = getNameType(SymbolName, E.Name, Machine);
|
ImportNameType NameType = getNameType(SymbolName, E.Name, Machine);
|
||||||
Expected<std::string> Name = E.ExtName.empty()
|
Expected<std::string> Name = E.ExtName.empty()
|
||||||
? SymbolName
|
? SymbolName
|
||||||
|
@ -388,6 +388,10 @@ static unsigned isMatchingStore(MachineInstr &LoadInst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned getPreIndexedOpcode(unsigned Opc) {
|
static unsigned getPreIndexedOpcode(unsigned Opc) {
|
||||||
|
// FIXME: We don't currently support creating pre-indexed loads/stores when
|
||||||
|
// the load or store is the unscaled version. If we decide to perform such an
|
||||||
|
// optimization in the future the cases for the unscaled loads/stores will
|
||||||
|
// need to be added here.
|
||||||
switch (Opc) {
|
switch (Opc) {
|
||||||
default:
|
default:
|
||||||
llvm_unreachable("Opcode has no pre-indexed equivalent!");
|
llvm_unreachable("Opcode has no pre-indexed equivalent!");
|
||||||
@ -451,32 +455,42 @@ static unsigned getPostIndexedOpcode(unsigned Opc) {
|
|||||||
default:
|
default:
|
||||||
llvm_unreachable("Opcode has no post-indexed wise equivalent!");
|
llvm_unreachable("Opcode has no post-indexed wise equivalent!");
|
||||||
case AArch64::STRSui:
|
case AArch64::STRSui:
|
||||||
|
case AArch64::STURSi:
|
||||||
return AArch64::STRSpost;
|
return AArch64::STRSpost;
|
||||||
case AArch64::STRDui:
|
case AArch64::STRDui:
|
||||||
|
case AArch64::STURDi:
|
||||||
return AArch64::STRDpost;
|
return AArch64::STRDpost;
|
||||||
case AArch64::STRQui:
|
case AArch64::STRQui:
|
||||||
|
case AArch64::STURQi:
|
||||||
return AArch64::STRQpost;
|
return AArch64::STRQpost;
|
||||||
case AArch64::STRBBui:
|
case AArch64::STRBBui:
|
||||||
return AArch64::STRBBpost;
|
return AArch64::STRBBpost;
|
||||||
case AArch64::STRHHui:
|
case AArch64::STRHHui:
|
||||||
return AArch64::STRHHpost;
|
return AArch64::STRHHpost;
|
||||||
case AArch64::STRWui:
|
case AArch64::STRWui:
|
||||||
|
case AArch64::STURWi:
|
||||||
return AArch64::STRWpost;
|
return AArch64::STRWpost;
|
||||||
case AArch64::STRXui:
|
case AArch64::STRXui:
|
||||||
|
case AArch64::STURXi:
|
||||||
return AArch64::STRXpost;
|
return AArch64::STRXpost;
|
||||||
case AArch64::LDRSui:
|
case AArch64::LDRSui:
|
||||||
|
case AArch64::LDURSi:
|
||||||
return AArch64::LDRSpost;
|
return AArch64::LDRSpost;
|
||||||
case AArch64::LDRDui:
|
case AArch64::LDRDui:
|
||||||
|
case AArch64::LDURDi:
|
||||||
return AArch64::LDRDpost;
|
return AArch64::LDRDpost;
|
||||||
case AArch64::LDRQui:
|
case AArch64::LDRQui:
|
||||||
|
case AArch64::LDURQi:
|
||||||
return AArch64::LDRQpost;
|
return AArch64::LDRQpost;
|
||||||
case AArch64::LDRBBui:
|
case AArch64::LDRBBui:
|
||||||
return AArch64::LDRBBpost;
|
return AArch64::LDRBBpost;
|
||||||
case AArch64::LDRHHui:
|
case AArch64::LDRHHui:
|
||||||
return AArch64::LDRHHpost;
|
return AArch64::LDRHHpost;
|
||||||
case AArch64::LDRWui:
|
case AArch64::LDRWui:
|
||||||
|
case AArch64::LDURWi:
|
||||||
return AArch64::LDRWpost;
|
return AArch64::LDRWpost;
|
||||||
case AArch64::LDRXui:
|
case AArch64::LDRXui:
|
||||||
|
case AArch64::LDURXi:
|
||||||
return AArch64::LDRXpost;
|
return AArch64::LDRXpost;
|
||||||
case AArch64::LDRSWui:
|
case AArch64::LDRSWui:
|
||||||
return AArch64::LDRSWpost;
|
return AArch64::LDRSWpost;
|
||||||
@ -1694,8 +1708,9 @@ bool AArch64LoadStoreOpt::optimizeBlock(MachineBasicBlock &MBB,
|
|||||||
++NumPostFolded;
|
++NumPostFolded;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Don't know how to handle pre/post-index versions, so move to the next
|
|
||||||
// instruction.
|
// Don't know how to handle unscaled pre/post-index versions below, so
|
||||||
|
// move to the next instruction.
|
||||||
if (TII->isUnscaledLdSt(Opc)) {
|
if (TII->isUnscaledLdSt(Opc)) {
|
||||||
++MBBI;
|
++MBBI;
|
||||||
break;
|
break;
|
||||||
|
@ -769,8 +769,7 @@ bool ARMExpandPseudo::ExpandCMP_SWAP(MachineBasicBlock &MBB,
|
|||||||
MachineInstr &MI = *MBBI;
|
MachineInstr &MI = *MBBI;
|
||||||
DebugLoc DL = MI.getDebugLoc();
|
DebugLoc DL = MI.getDebugLoc();
|
||||||
const MachineOperand &Dest = MI.getOperand(0);
|
const MachineOperand &Dest = MI.getOperand(0);
|
||||||
unsigned StatusReg = MI.getOperand(1).getReg();
|
unsigned TempReg = MI.getOperand(1).getReg();
|
||||||
bool StatusDead = MI.getOperand(1).isDead();
|
|
||||||
// Duplicating undef operands into 2 instructions does not guarantee the same
|
// Duplicating undef operands into 2 instructions does not guarantee the same
|
||||||
// value on both; However undef should be replaced by xzr anyway.
|
// value on both; However undef should be replaced by xzr anyway.
|
||||||
assert(!MI.getOperand(2).isUndef() && "cannot handle undef");
|
assert(!MI.getOperand(2).isUndef() && "cannot handle undef");
|
||||||
@ -797,23 +796,9 @@ bool ARMExpandPseudo::ExpandCMP_SWAP(MachineBasicBlock &MBB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// .Lloadcmp:
|
// .Lloadcmp:
|
||||||
// mov wStatus, #0
|
|
||||||
// ldrex rDest, [rAddr]
|
// ldrex rDest, [rAddr]
|
||||||
// cmp rDest, rDesired
|
// cmp rDest, rDesired
|
||||||
// bne .Ldone
|
// bne .Ldone
|
||||||
if (!StatusDead) {
|
|
||||||
if (IsThumb) {
|
|
||||||
BuildMI(LoadCmpBB, DL, TII->get(ARM::tMOVi8), StatusReg)
|
|
||||||
.addDef(ARM::CPSR, RegState::Dead)
|
|
||||||
.addImm(0)
|
|
||||||
.add(predOps(ARMCC::AL));
|
|
||||||
} else {
|
|
||||||
BuildMI(LoadCmpBB, DL, TII->get(ARM::MOVi), StatusReg)
|
|
||||||
.addImm(0)
|
|
||||||
.add(predOps(ARMCC::AL))
|
|
||||||
.add(condCodeOp());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MachineInstrBuilder MIB;
|
MachineInstrBuilder MIB;
|
||||||
MIB = BuildMI(LoadCmpBB, DL, TII->get(LdrexOp), Dest.getReg());
|
MIB = BuildMI(LoadCmpBB, DL, TII->get(LdrexOp), Dest.getReg());
|
||||||
@ -836,10 +821,10 @@ bool ARMExpandPseudo::ExpandCMP_SWAP(MachineBasicBlock &MBB,
|
|||||||
LoadCmpBB->addSuccessor(StoreBB);
|
LoadCmpBB->addSuccessor(StoreBB);
|
||||||
|
|
||||||
// .Lstore:
|
// .Lstore:
|
||||||
// strex rStatus, rNew, [rAddr]
|
// strex rTempReg, rNew, [rAddr]
|
||||||
// cmp rStatus, #0
|
// cmp rTempReg, #0
|
||||||
// bne .Lloadcmp
|
// bne .Lloadcmp
|
||||||
MIB = BuildMI(StoreBB, DL, TII->get(StrexOp), StatusReg)
|
MIB = BuildMI(StoreBB, DL, TII->get(StrexOp), TempReg)
|
||||||
.addReg(NewReg)
|
.addReg(NewReg)
|
||||||
.addReg(AddrReg);
|
.addReg(AddrReg);
|
||||||
if (StrexOp == ARM::t2STREX)
|
if (StrexOp == ARM::t2STREX)
|
||||||
@ -848,7 +833,7 @@ bool ARMExpandPseudo::ExpandCMP_SWAP(MachineBasicBlock &MBB,
|
|||||||
|
|
||||||
unsigned CMPri = IsThumb ? ARM::t2CMPri : ARM::CMPri;
|
unsigned CMPri = IsThumb ? ARM::t2CMPri : ARM::CMPri;
|
||||||
BuildMI(StoreBB, DL, TII->get(CMPri))
|
BuildMI(StoreBB, DL, TII->get(CMPri))
|
||||||
.addReg(StatusReg, getKillRegState(StatusDead))
|
.addReg(TempReg, RegState::Kill)
|
||||||
.addImm(0)
|
.addImm(0)
|
||||||
.add(predOps(ARMCC::AL));
|
.add(predOps(ARMCC::AL));
|
||||||
BuildMI(StoreBB, DL, TII->get(Bcc))
|
BuildMI(StoreBB, DL, TII->get(Bcc))
|
||||||
@ -904,8 +889,7 @@ bool ARMExpandPseudo::ExpandCMP_SWAP_64(MachineBasicBlock &MBB,
|
|||||||
MachineInstr &MI = *MBBI;
|
MachineInstr &MI = *MBBI;
|
||||||
DebugLoc DL = MI.getDebugLoc();
|
DebugLoc DL = MI.getDebugLoc();
|
||||||
MachineOperand &Dest = MI.getOperand(0);
|
MachineOperand &Dest = MI.getOperand(0);
|
||||||
unsigned StatusReg = MI.getOperand(1).getReg();
|
unsigned TempReg = MI.getOperand(1).getReg();
|
||||||
bool StatusDead = MI.getOperand(1).isDead();
|
|
||||||
// Duplicating undef operands into 2 instructions does not guarantee the same
|
// Duplicating undef operands into 2 instructions does not guarantee the same
|
||||||
// value on both; However undef should be replaced by xzr anyway.
|
// value on both; However undef should be replaced by xzr anyway.
|
||||||
assert(!MI.getOperand(2).isUndef() && "cannot handle undef");
|
assert(!MI.getOperand(2).isUndef() && "cannot handle undef");
|
||||||
@ -931,7 +915,7 @@ bool ARMExpandPseudo::ExpandCMP_SWAP_64(MachineBasicBlock &MBB,
|
|||||||
// .Lloadcmp:
|
// .Lloadcmp:
|
||||||
// ldrexd rDestLo, rDestHi, [rAddr]
|
// ldrexd rDestLo, rDestHi, [rAddr]
|
||||||
// cmp rDestLo, rDesiredLo
|
// cmp rDestLo, rDesiredLo
|
||||||
// sbcs rStatus<dead>, rDestHi, rDesiredHi
|
// sbcs rTempReg<dead>, rDestHi, rDesiredHi
|
||||||
// bne .Ldone
|
// bne .Ldone
|
||||||
unsigned LDREXD = IsThumb ? ARM::t2LDREXD : ARM::LDREXD;
|
unsigned LDREXD = IsThumb ? ARM::t2LDREXD : ARM::LDREXD;
|
||||||
MachineInstrBuilder MIB;
|
MachineInstrBuilder MIB;
|
||||||
@ -959,17 +943,17 @@ bool ARMExpandPseudo::ExpandCMP_SWAP_64(MachineBasicBlock &MBB,
|
|||||||
LoadCmpBB->addSuccessor(StoreBB);
|
LoadCmpBB->addSuccessor(StoreBB);
|
||||||
|
|
||||||
// .Lstore:
|
// .Lstore:
|
||||||
// strexd rStatus, rNewLo, rNewHi, [rAddr]
|
// strexd rTempReg, rNewLo, rNewHi, [rAddr]
|
||||||
// cmp rStatus, #0
|
// cmp rTempReg, #0
|
||||||
// bne .Lloadcmp
|
// bne .Lloadcmp
|
||||||
unsigned STREXD = IsThumb ? ARM::t2STREXD : ARM::STREXD;
|
unsigned STREXD = IsThumb ? ARM::t2STREXD : ARM::STREXD;
|
||||||
MIB = BuildMI(StoreBB, DL, TII->get(STREXD), StatusReg);
|
MIB = BuildMI(StoreBB, DL, TII->get(STREXD), TempReg);
|
||||||
addExclusiveRegPair(MIB, New, 0, IsThumb, TRI);
|
addExclusiveRegPair(MIB, New, 0, IsThumb, TRI);
|
||||||
MIB.addReg(AddrReg).add(predOps(ARMCC::AL));
|
MIB.addReg(AddrReg).add(predOps(ARMCC::AL));
|
||||||
|
|
||||||
unsigned CMPri = IsThumb ? ARM::t2CMPri : ARM::CMPri;
|
unsigned CMPri = IsThumb ? ARM::t2CMPri : ARM::CMPri;
|
||||||
BuildMI(StoreBB, DL, TII->get(CMPri))
|
BuildMI(StoreBB, DL, TII->get(CMPri))
|
||||||
.addReg(StatusReg, getKillRegState(StatusDead))
|
.addReg(TempReg, RegState::Kill)
|
||||||
.addImm(0)
|
.addImm(0)
|
||||||
.add(predOps(ARMCC::AL));
|
.add(predOps(ARMCC::AL));
|
||||||
BuildMI(StoreBB, DL, TII->get(Bcc))
|
BuildMI(StoreBB, DL, TII->get(Bcc))
|
||||||
|
@ -6053,21 +6053,21 @@ def SPACE : PseudoInst<(outs GPR:$Rd), (ins i32imm:$size, GPR:$Rn),
|
|||||||
// significantly more naive than the standard expansion: we conservatively
|
// significantly more naive than the standard expansion: we conservatively
|
||||||
// assume seq_cst, strong cmpxchg and omit clrex on failure.
|
// assume seq_cst, strong cmpxchg and omit clrex on failure.
|
||||||
|
|
||||||
let Constraints = "@earlyclobber $Rd,@earlyclobber $status",
|
let Constraints = "@earlyclobber $Rd,@earlyclobber $temp",
|
||||||
mayLoad = 1, mayStore = 1 in {
|
mayLoad = 1, mayStore = 1 in {
|
||||||
def CMP_SWAP_8 : PseudoInst<(outs GPR:$Rd, GPR:$status),
|
def CMP_SWAP_8 : PseudoInst<(outs GPR:$Rd, GPR:$temp),
|
||||||
(ins GPR:$addr, GPR:$desired, GPR:$new),
|
(ins GPR:$addr, GPR:$desired, GPR:$new),
|
||||||
NoItinerary, []>, Sched<[]>;
|
NoItinerary, []>, Sched<[]>;
|
||||||
|
|
||||||
def CMP_SWAP_16 : PseudoInst<(outs GPR:$Rd, GPR:$status),
|
def CMP_SWAP_16 : PseudoInst<(outs GPR:$Rd, GPR:$temp),
|
||||||
(ins GPR:$addr, GPR:$desired, GPR:$new),
|
(ins GPR:$addr, GPR:$desired, GPR:$new),
|
||||||
NoItinerary, []>, Sched<[]>;
|
NoItinerary, []>, Sched<[]>;
|
||||||
|
|
||||||
def CMP_SWAP_32 : PseudoInst<(outs GPR:$Rd, GPR:$status),
|
def CMP_SWAP_32 : PseudoInst<(outs GPR:$Rd, GPR:$temp),
|
||||||
(ins GPR:$addr, GPR:$desired, GPR:$new),
|
(ins GPR:$addr, GPR:$desired, GPR:$new),
|
||||||
NoItinerary, []>, Sched<[]>;
|
NoItinerary, []>, Sched<[]>;
|
||||||
|
|
||||||
def CMP_SWAP_64 : PseudoInst<(outs GPRPair:$Rd, GPR:$status),
|
def CMP_SWAP_64 : PseudoInst<(outs GPRPair:$Rd, GPR:$temp),
|
||||||
(ins GPR:$addr, GPRPair:$desired, GPRPair:$new),
|
(ins GPR:$addr, GPRPair:$desired, GPRPair:$new),
|
||||||
NoItinerary, []>, Sched<[]>;
|
NoItinerary, []>, Sched<[]>;
|
||||||
}
|
}
|
||||||
|
@ -419,6 +419,11 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||||||
setOperationAction(ISD::SELECT, VT, Custom);
|
setOperationAction(ISD::SELECT, VT, Custom);
|
||||||
setOperationAction(ISD::SETCC, VT, Custom);
|
setOperationAction(ISD::SETCC, VT, Custom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Custom action for SELECT MMX and expand action for SELECT_CC MMX
|
||||||
|
setOperationAction(ISD::SELECT, MVT::x86mmx, Custom);
|
||||||
|
setOperationAction(ISD::SELECT_CC, MVT::x86mmx, Expand);
|
||||||
|
|
||||||
setOperationAction(ISD::EH_RETURN , MVT::Other, Custom);
|
setOperationAction(ISD::EH_RETURN , MVT::Other, Custom);
|
||||||
// NOTE: EH_SJLJ_SETJMP/_LONGJMP supported here is NOT intended to support
|
// NOTE: EH_SJLJ_SETJMP/_LONGJMP supported here is NOT intended to support
|
||||||
// SjLj exception handling but a light-weight setjmp/longjmp replacement to
|
// SjLj exception handling but a light-weight setjmp/longjmp replacement to
|
||||||
@ -1383,7 +1388,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
|||||||
// (result) is 256-bit but the source is 512-bit wide.
|
// (result) is 256-bit but the source is 512-bit wide.
|
||||||
// 128-bit was made Custom under AVX1.
|
// 128-bit was made Custom under AVX1.
|
||||||
for (auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
|
for (auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
|
||||||
MVT::v8f32, MVT::v4f64 })
|
MVT::v8f32, MVT::v4f64, MVT::v1i1 })
|
||||||
setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Custom);
|
setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Custom);
|
||||||
for (auto VT : { MVT::v2i1, MVT::v4i1, MVT::v8i1,
|
for (auto VT : { MVT::v2i1, MVT::v4i1, MVT::v8i1,
|
||||||
MVT::v16i1, MVT::v32i1, MVT::v64i1 })
|
MVT::v16i1, MVT::v32i1, MVT::v64i1 })
|
||||||
@ -14570,6 +14575,21 @@ static SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, const X86Subtarget &Subtarget,
|
|||||||
unsigned IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue();
|
unsigned IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue();
|
||||||
MVT ResVT = Op.getSimpleValueType();
|
MVT ResVT = Op.getSimpleValueType();
|
||||||
|
|
||||||
|
// When v1i1 is legal a scalarization of a vselect with a vXi1 Cond
|
||||||
|
// would result with: v1i1 = extract_subvector(vXi1, idx).
|
||||||
|
// Lower these into extract_vector_elt which is already selectable.
|
||||||
|
if (ResVT == MVT::v1i1) {
|
||||||
|
assert(Subtarget.hasAVX512() &&
|
||||||
|
"Boolean EXTRACT_SUBVECTOR requires AVX512");
|
||||||
|
|
||||||
|
MVT EltVT = ResVT.getVectorElementType();
|
||||||
|
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||||
|
MVT LegalVT =
|
||||||
|
(TLI.getTypeToTransformTo(*DAG.getContext(), EltVT)).getSimpleVT();
|
||||||
|
SDValue Res = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, LegalVT, In, Idx);
|
||||||
|
return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, ResVT, Res);
|
||||||
|
}
|
||||||
|
|
||||||
assert((In.getSimpleValueType().is256BitVector() ||
|
assert((In.getSimpleValueType().is256BitVector() ||
|
||||||
In.getSimpleValueType().is512BitVector()) &&
|
In.getSimpleValueType().is512BitVector()) &&
|
||||||
"Can only extract from 256-bit or 512-bit vectors");
|
"Can only extract from 256-bit or 512-bit vectors");
|
||||||
@ -20651,8 +20671,8 @@ static SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, const X86Subtarget &Subtarget,
|
|||||||
}
|
}
|
||||||
// ADC/ADCX/SBB
|
// ADC/ADCX/SBB
|
||||||
case ADX: {
|
case ADX: {
|
||||||
SDVTList CFVTs = DAG.getVTList(Op->getValueType(0), MVT::Other);
|
SDVTList CFVTs = DAG.getVTList(Op->getValueType(0), MVT::i32);
|
||||||
SDVTList VTs = DAG.getVTList(Op.getOperand(3)->getValueType(0), MVT::Other);
|
SDVTList VTs = DAG.getVTList(Op.getOperand(3)->getValueType(0), MVT::i32);
|
||||||
SDValue GenCF = DAG.getNode(X86ISD::ADD, dl, CFVTs, Op.getOperand(2),
|
SDValue GenCF = DAG.getNode(X86ISD::ADD, dl, CFVTs, Op.getOperand(2),
|
||||||
DAG.getConstant(-1, dl, MVT::i8));
|
DAG.getConstant(-1, dl, MVT::i8));
|
||||||
SDValue Res = DAG.getNode(IntrData->Opc0, dl, VTs, Op.getOperand(3),
|
SDValue Res = DAG.getNode(IntrData->Opc0, dl, VTs, Op.getOperand(3),
|
||||||
@ -30663,6 +30683,14 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG,
|
|||||||
return SDValue(N, 0);
|
return SDValue(N, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Custom action for SELECT MMX
|
||||||
|
if (VT == MVT::x86mmx) {
|
||||||
|
LHS = DAG.getBitcast(MVT::i64, LHS);
|
||||||
|
RHS = DAG.getBitcast(MVT::i64, RHS);
|
||||||
|
SDValue newSelect = DAG.getNode(ISD::SELECT, DL, MVT::i64, Cond, LHS, RHS);
|
||||||
|
return DAG.getBitcast(VT, newSelect);
|
||||||
|
}
|
||||||
|
|
||||||
return SDValue();
|
return SDValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33358,7 +33386,8 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
|
|||||||
SDValue NewLd = DAG.getLoad(LdVT, LdDL, Ld->getChain(), Ld->getBasePtr(),
|
SDValue NewLd = DAG.getLoad(LdVT, LdDL, Ld->getChain(), Ld->getBasePtr(),
|
||||||
Ld->getPointerInfo(), Ld->getAlignment(),
|
Ld->getPointerInfo(), Ld->getAlignment(),
|
||||||
Ld->getMemOperand()->getFlags());
|
Ld->getMemOperand()->getFlags());
|
||||||
SDValue NewChain = NewLd.getValue(1);
|
// Make sure new load is placed in same chain order.
|
||||||
|
SDValue NewChain = DAG.makeEquivalentMemoryOrdering(Ld, NewLd);
|
||||||
if (TokenFactorIndex >= 0) {
|
if (TokenFactorIndex >= 0) {
|
||||||
Ops.push_back(NewChain);
|
Ops.push_back(NewChain);
|
||||||
NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, Ops);
|
NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, Ops);
|
||||||
@ -33379,11 +33408,12 @@ static SDValue combineStore(SDNode *N, SelectionDAG &DAG,
|
|||||||
Ld->getPointerInfo().getWithOffset(4),
|
Ld->getPointerInfo().getWithOffset(4),
|
||||||
MinAlign(Ld->getAlignment(), 4),
|
MinAlign(Ld->getAlignment(), 4),
|
||||||
Ld->getMemOperand()->getFlags());
|
Ld->getMemOperand()->getFlags());
|
||||||
|
// Make sure new loads are placed in same chain order.
|
||||||
|
SDValue NewChain = DAG.makeEquivalentMemoryOrdering(Ld, LoLd);
|
||||||
|
NewChain = DAG.makeEquivalentMemoryOrdering(Ld, HiLd);
|
||||||
|
|
||||||
SDValue NewChain = LoLd.getValue(1);
|
|
||||||
if (TokenFactorIndex >= 0) {
|
if (TokenFactorIndex >= 0) {
|
||||||
Ops.push_back(LoLd);
|
Ops.push_back(NewChain);
|
||||||
Ops.push_back(HiLd);
|
|
||||||
NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, Ops);
|
NewChain = DAG.getNode(ISD::TokenFactor, LdDL, MVT::Other, Ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -978,6 +978,44 @@ multiclass avx512_int_broadcast_reg<bits<8> opc, X86VectorVTInfo _,
|
|||||||
(_.VT (OpNode SrcRC:$src))>, T8PD, EVEX;
|
(_.VT (OpNode SrcRC:$src))>, T8PD, EVEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
multiclass avx512_int_broadcastbw_reg<bits<8> opc, string Name,
|
||||||
|
X86VectorVTInfo _, SDPatternOperator OpNode,
|
||||||
|
RegisterClass SrcRC, SubRegIndex Subreg> {
|
||||||
|
let ExeDomain = _.ExeDomain in
|
||||||
|
defm r : AVX512_maskable_custom<opc, MRMSrcReg,
|
||||||
|
(outs _.RC:$dst), (ins GR32:$src),
|
||||||
|
!con((ins _.RC:$src0, _.KRCWM:$mask), (ins GR32:$src)),
|
||||||
|
!con((ins _.KRCWM:$mask), (ins GR32:$src)),
|
||||||
|
"vpbroadcast"##_.Suffix, "$src", "$src", [], [], [],
|
||||||
|
"$src0 = $dst">, T8PD, EVEX;
|
||||||
|
|
||||||
|
def : Pat <(_.VT (OpNode SrcRC:$src)),
|
||||||
|
(!cast<Instruction>(Name#r)
|
||||||
|
(i32 (INSERT_SUBREG (i32 (IMPLICIT_DEF)), SrcRC:$src, Subreg)))>;
|
||||||
|
|
||||||
|
def : Pat <(vselect _.KRCWM:$mask, (_.VT (OpNode SrcRC:$src)), _.RC:$src0),
|
||||||
|
(!cast<Instruction>(Name#rk) _.RC:$src0, _.KRCWM:$mask,
|
||||||
|
(i32 (INSERT_SUBREG (i32 (IMPLICIT_DEF)), SrcRC:$src, Subreg)))>;
|
||||||
|
|
||||||
|
def : Pat <(vselect _.KRCWM:$mask, (_.VT (OpNode SrcRC:$src)), _.ImmAllZerosV),
|
||||||
|
(!cast<Instruction>(Name#rkz) _.KRCWM:$mask,
|
||||||
|
(i32 (INSERT_SUBREG (i32 (IMPLICIT_DEF)), SrcRC:$src, Subreg)))>;
|
||||||
|
}
|
||||||
|
|
||||||
|
multiclass avx512_int_broadcastbw_reg_vl<bits<8> opc, string Name,
|
||||||
|
AVX512VLVectorVTInfo _, SDPatternOperator OpNode,
|
||||||
|
RegisterClass SrcRC, SubRegIndex Subreg, Predicate prd> {
|
||||||
|
let Predicates = [prd] in
|
||||||
|
defm Z : avx512_int_broadcastbw_reg<opc, Name#Z, _.info512, OpNode, SrcRC,
|
||||||
|
Subreg>, EVEX_V512;
|
||||||
|
let Predicates = [prd, HasVLX] in {
|
||||||
|
defm Z256 : avx512_int_broadcastbw_reg<opc, Name#Z256, _.info256, OpNode,
|
||||||
|
SrcRC, Subreg>, EVEX_V256;
|
||||||
|
defm Z128 : avx512_int_broadcastbw_reg<opc, Name#Z128, _.info128, OpNode,
|
||||||
|
SrcRC, Subreg>, EVEX_V128;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
multiclass avx512_int_broadcast_reg_vl<bits<8> opc, AVX512VLVectorVTInfo _,
|
multiclass avx512_int_broadcast_reg_vl<bits<8> opc, AVX512VLVectorVTInfo _,
|
||||||
SDPatternOperator OpNode,
|
SDPatternOperator OpNode,
|
||||||
RegisterClass SrcRC, Predicate prd> {
|
RegisterClass SrcRC, Predicate prd> {
|
||||||
@ -989,18 +1027,11 @@ multiclass avx512_int_broadcast_reg_vl<bits<8> opc, AVX512VLVectorVTInfo _,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let isCodeGenOnly = 1 in {
|
defm VPBROADCASTBr : avx512_int_broadcastbw_reg_vl<0x7A, "VPBROADCASTBr",
|
||||||
defm VPBROADCASTBr : avx512_int_broadcast_reg_vl<0x7A, avx512vl_i8_info,
|
avx512vl_i8_info, X86VBroadcast, GR8, sub_8bit, HasBWI>;
|
||||||
X86VBroadcast, GR8, HasBWI>;
|
defm VPBROADCASTWr : avx512_int_broadcastbw_reg_vl<0x7B, "VPBROADCASTWr",
|
||||||
defm VPBROADCASTWr : avx512_int_broadcast_reg_vl<0x7B, avx512vl_i16_info,
|
avx512vl_i16_info, X86VBroadcast, GR16, sub_16bit,
|
||||||
X86VBroadcast, GR16, HasBWI>;
|
HasBWI>;
|
||||||
}
|
|
||||||
let isAsmParserOnly = 1 in {
|
|
||||||
defm VPBROADCASTBr_Alt : avx512_int_broadcast_reg_vl<0x7A, avx512vl_i8_info,
|
|
||||||
null_frag, GR32, HasBWI>;
|
|
||||||
defm VPBROADCASTWr_Alt : avx512_int_broadcast_reg_vl<0x7B, avx512vl_i16_info,
|
|
||||||
null_frag, GR32, HasBWI>;
|
|
||||||
}
|
|
||||||
defm VPBROADCASTDr : avx512_int_broadcast_reg_vl<0x7C, avx512vl_i32_info,
|
defm VPBROADCASTDr : avx512_int_broadcast_reg_vl<0x7C, avx512vl_i32_info,
|
||||||
X86VBroadcast, GR32, HasAVX512>;
|
X86VBroadcast, GR32, HasAVX512>;
|
||||||
defm VPBROADCASTQr : avx512_int_broadcast_reg_vl<0x7C, avx512vl_i64_info,
|
defm VPBROADCASTQr : avx512_int_broadcast_reg_vl<0x7C, avx512vl_i64_info,
|
||||||
|
@ -60,11 +60,13 @@ std::vector<std::unique_ptr<MemoryBuffer>> OwningMBs;
|
|||||||
|
|
||||||
// Opens a file. Path has to be resolved already.
|
// Opens a file. Path has to be resolved already.
|
||||||
// Newly created memory buffers are owned by this driver.
|
// Newly created memory buffers are owned by this driver.
|
||||||
MemoryBufferRef openFile(StringRef Path) {
|
Optional<MemoryBufferRef> openFile(StringRef Path) {
|
||||||
ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB = MemoryBuffer::getFile(Path);
|
ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB = MemoryBuffer::getFile(Path);
|
||||||
|
|
||||||
if (std::error_code EC = MB.getError())
|
if (std::error_code EC = MB.getError()) {
|
||||||
llvm::errs() << "fail openFile: " << EC.message() << "\n";
|
llvm::errs() << "fail openFile: " << EC.message() << "\n";
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
MemoryBufferRef MBRef = MB.get()->getMemBufferRef();
|
MemoryBufferRef MBRef = MB.get()->getMemBufferRef();
|
||||||
OwningMBs.push_back(std::move(MB.get())); // take ownership
|
OwningMBs.push_back(std::move(MB.get())); // take ownership
|
||||||
@ -114,11 +116,16 @@ int llvm::dlltoolDriverMain(llvm::ArrayRef<const char *> ArgsArr) {
|
|||||||
for (auto *Arg : Args.filtered(OPT_UNKNOWN))
|
for (auto *Arg : Args.filtered(OPT_UNKNOWN))
|
||||||
llvm::errs() << "ignoring unknown argument: " << Arg->getSpelling() << "\n";
|
llvm::errs() << "ignoring unknown argument: " << Arg->getSpelling() << "\n";
|
||||||
|
|
||||||
MemoryBufferRef MB;
|
if (!Args.hasArg(OPT_d)) {
|
||||||
if (auto *Arg = Args.getLastArg(OPT_d))
|
llvm::errs() << "no definition file specified\n";
|
||||||
MB = openFile(Arg->getValue());
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!MB.getBufferSize()) {
|
Optional<MemoryBufferRef> MB = openFile(Args.getLastArg(OPT_d)->getValue());
|
||||||
|
if (!MB)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (!MB->getBufferSize()) {
|
||||||
llvm::errs() << "definition file empty\n";
|
llvm::errs() << "definition file empty\n";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -133,7 +140,7 @@ int llvm::dlltoolDriverMain(llvm::ArrayRef<const char *> ArgsArr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Expected<COFFModuleDefinition> Def =
|
Expected<COFFModuleDefinition> Def =
|
||||||
parseCOFFModuleDefinition(MB, Machine, true);
|
parseCOFFModuleDefinition(*MB, Machine, true);
|
||||||
|
|
||||||
if (!Def) {
|
if (!Def) {
|
||||||
llvm::errs() << "error parsing definition\n"
|
llvm::errs() << "error parsing definition\n"
|
||||||
@ -154,7 +161,7 @@ int llvm::dlltoolDriverMain(llvm::ArrayRef<const char *> ArgsArr) {
|
|||||||
if (Path.empty())
|
if (Path.empty())
|
||||||
Path = getImplibPath(Def->OutputFile);
|
Path = getImplibPath(Def->OutputFile);
|
||||||
|
|
||||||
if (writeImportLibrary(Def->OutputFile, Path, Def->Exports, Machine))
|
if (writeImportLibrary(Def->OutputFile, Path, Def->Exports, Machine, true))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1470,6 +1470,7 @@ void DFSanVisitor::visitCallSite(CallSite CS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
i = CS.arg_begin();
|
i = CS.arg_begin();
|
||||||
|
const unsigned ShadowArgStart = Args.size();
|
||||||
for (unsigned n = FT->getNumParams(); n != 0; ++i, --n)
|
for (unsigned n = FT->getNumParams(); n != 0; ++i, --n)
|
||||||
Args.push_back(DFSF.getShadow(*i));
|
Args.push_back(DFSF.getShadow(*i));
|
||||||
|
|
||||||
@ -1505,6 +1506,15 @@ void DFSanVisitor::visitCallSite(CallSite CS) {
|
|||||||
CustomCI->setCallingConv(CI->getCallingConv());
|
CustomCI->setCallingConv(CI->getCallingConv());
|
||||||
CustomCI->setAttributes(CI->getAttributes());
|
CustomCI->setAttributes(CI->getAttributes());
|
||||||
|
|
||||||
|
// Update the parameter attributes of the custom call instruction to
|
||||||
|
// zero extend the shadow parameters. This is required for targets
|
||||||
|
// which consider ShadowTy an illegal type.
|
||||||
|
for (unsigned n = 0; n < FT->getNumParams(); n++) {
|
||||||
|
const unsigned ArgNo = ShadowArgStart + n;
|
||||||
|
if (CustomCI->getArgOperand(ArgNo)->getType() == DFSF.DFS.ShadowTy)
|
||||||
|
CustomCI->addParamAttr(ArgNo, Attribute::ZExt);
|
||||||
|
}
|
||||||
|
|
||||||
if (!FT->getReturnType()->isVoidTy()) {
|
if (!FT->getReturnType()->isVoidTy()) {
|
||||||
LoadInst *LabelLoad = IRB.CreateLoad(DFSF.LabelReturnAlloca);
|
LoadInst *LabelLoad = IRB.CreateLoad(DFSF.LabelReturnAlloca);
|
||||||
DFSF.setShadow(CustomCI, LabelLoad);
|
DFSF.setShadow(CustomCI, LabelLoad);
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/Transforms/Scalar/BDCE.h"
|
#include "llvm/Transforms/Scalar/BDCE.h"
|
||||||
|
#include "llvm/ADT/SmallPtrSet.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
#include "llvm/Analysis/DemandedBits.h"
|
#include "llvm/Analysis/DemandedBits.h"
|
||||||
@ -35,6 +36,46 @@ using namespace llvm;
|
|||||||
STATISTIC(NumRemoved, "Number of instructions removed (unused)");
|
STATISTIC(NumRemoved, "Number of instructions removed (unused)");
|
||||||
STATISTIC(NumSimplified, "Number of instructions trivialized (dead bits)");
|
STATISTIC(NumSimplified, "Number of instructions trivialized (dead bits)");
|
||||||
|
|
||||||
|
/// If an instruction is trivialized (dead), then the chain of users of that
|
||||||
|
/// instruction may need to be cleared of assumptions that can no longer be
|
||||||
|
/// guaranteed correct.
|
||||||
|
static void clearAssumptionsOfUsers(Instruction *I, DemandedBits &DB) {
|
||||||
|
assert(I->getType()->isIntegerTy() && "Trivializing a non-integer value?");
|
||||||
|
|
||||||
|
// Initialize the worklist with eligible direct users.
|
||||||
|
SmallVector<Instruction *, 16> WorkList;
|
||||||
|
for (User *JU : I->users()) {
|
||||||
|
// If all bits of a user are demanded, then we know that nothing below that
|
||||||
|
// in the def-use chain needs to be changed.
|
||||||
|
auto *J = dyn_cast<Instruction>(JU);
|
||||||
|
if (J && !DB.getDemandedBits(J).isAllOnesValue())
|
||||||
|
WorkList.push_back(J);
|
||||||
|
}
|
||||||
|
|
||||||
|
// DFS through subsequent users while tracking visits to avoid cycles.
|
||||||
|
SmallPtrSet<Instruction *, 16> Visited;
|
||||||
|
while (!WorkList.empty()) {
|
||||||
|
Instruction *J = WorkList.pop_back_val();
|
||||||
|
|
||||||
|
// NSW, NUW, and exact are based on operands that might have changed.
|
||||||
|
J->dropPoisonGeneratingFlags();
|
||||||
|
|
||||||
|
// We do not have to worry about llvm.assume or range metadata:
|
||||||
|
// 1. llvm.assume demands its operand, so trivializing can't change it.
|
||||||
|
// 2. range metadata only applies to memory accesses which demand all bits.
|
||||||
|
|
||||||
|
Visited.insert(J);
|
||||||
|
|
||||||
|
for (User *KU : J->users()) {
|
||||||
|
// If all bits of a user are demanded, then we know that nothing below
|
||||||
|
// that in the def-use chain needs to be changed.
|
||||||
|
auto *K = dyn_cast<Instruction>(KU);
|
||||||
|
if (K && !Visited.count(K) && !DB.getDemandedBits(K).isAllOnesValue())
|
||||||
|
WorkList.push_back(K);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool bitTrackingDCE(Function &F, DemandedBits &DB) {
|
static bool bitTrackingDCE(Function &F, DemandedBits &DB) {
|
||||||
SmallVector<Instruction*, 128> Worklist;
|
SmallVector<Instruction*, 128> Worklist;
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
@ -51,6 +92,9 @@ static bool bitTrackingDCE(Function &F, DemandedBits &DB) {
|
|||||||
// replacing all uses with something else. Then, if they don't need to
|
// replacing all uses with something else. Then, if they don't need to
|
||||||
// remain live (because they have side effects, etc.) we can remove them.
|
// remain live (because they have side effects, etc.) we can remove them.
|
||||||
DEBUG(dbgs() << "BDCE: Trivializing: " << I << " (all bits dead)\n");
|
DEBUG(dbgs() << "BDCE: Trivializing: " << I << " (all bits dead)\n");
|
||||||
|
|
||||||
|
clearAssumptionsOfUsers(&I, DB);
|
||||||
|
|
||||||
// FIXME: In theory we could substitute undef here instead of zero.
|
// FIXME: In theory we could substitute undef here instead of zero.
|
||||||
// This should be reconsidered once we settle on the semantics of
|
// This should be reconsidered once we settle on the semantics of
|
||||||
// undef, poison, etc.
|
// undef, poison, etc.
|
||||||
|
@ -3206,6 +3206,8 @@ enum CXCallingConv {
|
|||||||
CXCallingConv_X86RegCall = 8,
|
CXCallingConv_X86RegCall = 8,
|
||||||
CXCallingConv_IntelOclBicc = 9,
|
CXCallingConv_IntelOclBicc = 9,
|
||||||
CXCallingConv_Win64 = 10,
|
CXCallingConv_Win64 = 10,
|
||||||
|
/* Alias for compatibility with older versions of API. */
|
||||||
|
CXCallingConv_X86_64Win64 = CXCallingConv_Win64,
|
||||||
CXCallingConv_X86_64SysV = 11,
|
CXCallingConv_X86_64SysV = 11,
|
||||||
CXCallingConv_X86VectorCall = 12,
|
CXCallingConv_X86VectorCall = 12,
|
||||||
CXCallingConv_Swift = 13,
|
CXCallingConv_Swift = 13,
|
||||||
|
@ -1666,8 +1666,7 @@ class FunctionDecl : public DeclaratorDecl, public DeclContext,
|
|||||||
unsigned HasSkippedBody : 1;
|
unsigned HasSkippedBody : 1;
|
||||||
|
|
||||||
/// Indicates if the function declaration will have a body, once we're done
|
/// Indicates if the function declaration will have a body, once we're done
|
||||||
/// parsing it. (We don't set it to false when we're done parsing, in the
|
/// parsing it.
|
||||||
/// hopes this is simpler.)
|
|
||||||
unsigned WillHaveBody : 1;
|
unsigned WillHaveBody : 1;
|
||||||
|
|
||||||
/// \brief End part of this FunctionDecl's source range.
|
/// \brief End part of this FunctionDecl's source range.
|
||||||
|
@ -138,9 +138,10 @@ def err_drv_cc_print_options_failure : Error<
|
|||||||
def err_drv_lto_without_lld : Error<"LTO requires -fuse-ld=lld">;
|
def err_drv_lto_without_lld : Error<"LTO requires -fuse-ld=lld">;
|
||||||
def err_drv_preamble_format : Error<
|
def err_drv_preamble_format : Error<
|
||||||
"incorrect format for -preamble-bytes=N,END">;
|
"incorrect format for -preamble-bytes=N,END">;
|
||||||
def err_invalid_ios_deployment_target : Error<
|
def warn_invalid_ios_deployment_target : Warning<
|
||||||
"invalid iOS deployment version '%0', iOS 10 is the maximum deployment "
|
"invalid iOS deployment version '%0', iOS 10 is the maximum deployment "
|
||||||
"target for 32-bit targets">;
|
"target for 32-bit targets">, InGroup<InvalidIOSDeploymentTarget>,
|
||||||
|
DefaultError;
|
||||||
def err_drv_conflicting_deployment_targets : Error<
|
def err_drv_conflicting_deployment_targets : Error<
|
||||||
"conflicting deployment targets, both '%0' and '%1' are present in environment">;
|
"conflicting deployment targets, both '%0' and '%1' are present in environment">;
|
||||||
def err_arc_unsupported_on_runtime : Error<
|
def err_arc_unsupported_on_runtime : Error<
|
||||||
|
@ -151,9 +151,13 @@ def GNUFlexibleArrayUnionMember : DiagGroup<"gnu-flexible-array-union-member">;
|
|||||||
def GNUFoldingConstant : DiagGroup<"gnu-folding-constant">;
|
def GNUFoldingConstant : DiagGroup<"gnu-folding-constant">;
|
||||||
def FormatExtraArgs : DiagGroup<"format-extra-args">;
|
def FormatExtraArgs : DiagGroup<"format-extra-args">;
|
||||||
def FormatZeroLength : DiagGroup<"format-zero-length">;
|
def FormatZeroLength : DiagGroup<"format-zero-length">;
|
||||||
def CXX1zCompatMangling : DiagGroup<"c++1z-compat-mangling">;
|
|
||||||
|
def InvalidIOSDeploymentTarget : DiagGroup<"invalid-ios-deployment-target">;
|
||||||
|
|
||||||
|
def CXX17CompatMangling : DiagGroup<"c++17-compat-mangling">;
|
||||||
|
def : DiagGroup<"c++1z-compat-mangling", [CXX17CompatMangling]>;
|
||||||
// Name of this warning in GCC.
|
// Name of this warning in GCC.
|
||||||
def NoexceptType : DiagGroup<"noexcept-type", [CXX1zCompatMangling]>;
|
def NoexceptType : DiagGroup<"noexcept-type", [CXX17CompatMangling]>;
|
||||||
|
|
||||||
// Warnings for C++1y code which is not compatible with prior C++ standards.
|
// Warnings for C++1y code which is not compatible with prior C++ standards.
|
||||||
def CXXPre14Compat : DiagGroup<"c++98-c++11-compat">;
|
def CXXPre14Compat : DiagGroup<"c++98-c++11-compat">;
|
||||||
@ -215,9 +219,10 @@ def CXX14Compat : DiagGroup<"c++14-compat", [CXXPre1zCompat]>;
|
|||||||
def CXX14CompatPedantic : DiagGroup<"c++14-compat-pedantic",
|
def CXX14CompatPedantic : DiagGroup<"c++14-compat-pedantic",
|
||||||
[CXXPre1zCompatPedantic]>;
|
[CXXPre1zCompatPedantic]>;
|
||||||
|
|
||||||
def CXX1zCompat : DiagGroup<"c++1z-compat", [DeprecatedRegister,
|
def CXX17Compat : DiagGroup<"c++17-compat", [DeprecatedRegister,
|
||||||
DeprecatedIncrementBool,
|
DeprecatedIncrementBool,
|
||||||
CXX1zCompatMangling]>;
|
CXX17CompatMangling]>;
|
||||||
|
def : DiagGroup<"c++1z-compat", [CXX17Compat]>;
|
||||||
|
|
||||||
def ExitTimeDestructors : DiagGroup<"exit-time-destructors">;
|
def ExitTimeDestructors : DiagGroup<"exit-time-destructors">;
|
||||||
def FlexibleArrayExtensions : DiagGroup<"flexible-array-extensions">;
|
def FlexibleArrayExtensions : DiagGroup<"flexible-array-extensions">;
|
||||||
@ -769,10 +774,11 @@ def CXX14 : DiagGroup<"c++14-extensions", [CXX14BinaryLiteral]>;
|
|||||||
|
|
||||||
// A warning group for warnings about using C++1z features as extensions in
|
// A warning group for warnings about using C++1z features as extensions in
|
||||||
// earlier C++ versions.
|
// earlier C++ versions.
|
||||||
def CXX1z : DiagGroup<"c++1z-extensions">;
|
def CXX17 : DiagGroup<"c++17-extensions">;
|
||||||
|
|
||||||
def : DiagGroup<"c++0x-extensions", [CXX11]>;
|
def : DiagGroup<"c++0x-extensions", [CXX11]>;
|
||||||
def : DiagGroup<"c++1y-extensions", [CXX14]>;
|
def : DiagGroup<"c++1y-extensions", [CXX14]>;
|
||||||
|
def : DiagGroup<"c++1z-extensions", [CXX17]>;
|
||||||
|
|
||||||
def DelegatingCtorCycles :
|
def DelegatingCtorCycles :
|
||||||
DiagGroup<"delegating-ctor-cycles">;
|
DiagGroup<"delegating-ctor-cycles">;
|
||||||
|
@ -181,10 +181,10 @@ def err_hex_constant_requires : Error<
|
|||||||
def ext_hex_constant_invalid : Extension<
|
def ext_hex_constant_invalid : Extension<
|
||||||
"hexadecimal floating constants are a C99 feature">, InGroup<C99>;
|
"hexadecimal floating constants are a C99 feature">, InGroup<C99>;
|
||||||
def ext_hex_literal_invalid : Extension<
|
def ext_hex_literal_invalid : Extension<
|
||||||
"hexadecimal floating literals are a C++1z feature">, InGroup<CXX1z>;
|
"hexadecimal floating literals are a C++17 feature">, InGroup<CXX17>;
|
||||||
def warn_cxx1z_hex_literal : Warning<
|
def warn_cxx1z_hex_literal : Warning<
|
||||||
"hexadecimal floating literals are incompatible with "
|
"hexadecimal floating literals are incompatible with "
|
||||||
"C++ standards before C++1z">,
|
"C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompatPedantic>, DefaultIgnore;
|
InGroup<CXXPre1zCompatPedantic>, DefaultIgnore;
|
||||||
def ext_binary_literal : Extension<
|
def ext_binary_literal : Extension<
|
||||||
"binary integer literals are a GNU extension">, InGroup<GNUBinaryLiteral>;
|
"binary integer literals are a GNU extension">, InGroup<GNUBinaryLiteral>;
|
||||||
@ -208,7 +208,7 @@ def warn_cxx98_compat_unicode_literal : Warning<
|
|||||||
"unicode literals are incompatible with C++98">,
|
"unicode literals are incompatible with C++98">,
|
||||||
InGroup<CXX98Compat>, DefaultIgnore;
|
InGroup<CXX98Compat>, DefaultIgnore;
|
||||||
def warn_cxx14_compat_u8_character_literal : Warning<
|
def warn_cxx14_compat_u8_character_literal : Warning<
|
||||||
"unicode literals are incompatible with C++ standards before C++1z">,
|
"unicode literals are incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def warn_cxx11_compat_user_defined_literal : Warning<
|
def warn_cxx11_compat_user_defined_literal : Warning<
|
||||||
"identifier after literal will be treated as a user-defined literal suffix "
|
"identifier after literal will be treated as a user-defined literal suffix "
|
||||||
|
@ -211,10 +211,10 @@ def err_inline_namespace_alias : Error<"namespace alias cannot be inline">;
|
|||||||
def err_namespace_nonnamespace_scope : Error<
|
def err_namespace_nonnamespace_scope : Error<
|
||||||
"namespaces can only be defined in global or namespace scope">;
|
"namespaces can only be defined in global or namespace scope">;
|
||||||
def ext_nested_namespace_definition : ExtWarn<
|
def ext_nested_namespace_definition : ExtWarn<
|
||||||
"nested namespace definition is a C++1z extension; "
|
"nested namespace definition is a C++17 extension; "
|
||||||
"define each namespace separately">, InGroup<CXX1z>;
|
"define each namespace separately">, InGroup<CXX17>;
|
||||||
def warn_cxx14_compat_nested_namespace_definition : Warning<
|
def warn_cxx14_compat_nested_namespace_definition : Warning<
|
||||||
"nested namespace definition is incompatible with C++ standards before C++1z">,
|
"nested namespace definition is incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def err_inline_nested_namespace_definition : Error<
|
def err_inline_nested_namespace_definition : Error<
|
||||||
"nested namespace definition cannot be 'inline'">;
|
"nested namespace definition cannot be 'inline'">;
|
||||||
@ -358,7 +358,7 @@ def err_expected_coloncolon_after_super : Error<
|
|||||||
"expected '::' after '__super'">;
|
"expected '::' after '__super'">;
|
||||||
|
|
||||||
def ext_decomp_decl_empty : ExtWarn<
|
def ext_decomp_decl_empty : ExtWarn<
|
||||||
"ISO C++1z does not allow a decomposition group to be empty">,
|
"ISO C++17 does not allow a decomposition group to be empty">,
|
||||||
InGroup<DiagGroup<"empty-decomposition">>;
|
InGroup<DiagGroup<"empty-decomposition">>;
|
||||||
|
|
||||||
/// Objective-C parser diagnostics
|
/// Objective-C parser diagnostics
|
||||||
@ -522,16 +522,16 @@ def err_function_is_not_record : Error<
|
|||||||
def err_super_in_using_declaration : Error<
|
def err_super_in_using_declaration : Error<
|
||||||
"'__super' cannot be used with a using declaration">;
|
"'__super' cannot be used with a using declaration">;
|
||||||
def ext_constexpr_if : ExtWarn<
|
def ext_constexpr_if : ExtWarn<
|
||||||
"constexpr if is a C++1z extension">, InGroup<CXX1z>;
|
"constexpr if is a C++17 extension">, InGroup<CXX17>;
|
||||||
def warn_cxx14_compat_constexpr_if : Warning<
|
def warn_cxx14_compat_constexpr_if : Warning<
|
||||||
"constexpr if is incompatible with C++ standards before C++1z">,
|
"constexpr if is incompatible with C++ standards before C++17">,
|
||||||
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
||||||
def ext_init_statement : ExtWarn<
|
def ext_init_statement : ExtWarn<
|
||||||
"'%select{if|switch}0' initialization statements are a C++1z extension">,
|
"'%select{if|switch}0' initialization statements are a C++17 extension">,
|
||||||
InGroup<CXX1z>;
|
InGroup<CXX17>;
|
||||||
def warn_cxx14_compat_init_statement : Warning<
|
def warn_cxx14_compat_init_statement : Warning<
|
||||||
"%select{if|switch}0 initialization statements are incompatible with "
|
"%select{if|switch}0 initialization statements are incompatible with "
|
||||||
"C++ standards before C++1z">, DefaultIgnore, InGroup<CXXPre1zCompat>;
|
"C++ standards before C++17">, DefaultIgnore, InGroup<CXXPre1zCompat>;
|
||||||
|
|
||||||
// C++ derived classes
|
// C++ derived classes
|
||||||
def err_dup_virtual : Error<"duplicate 'virtual' in base specifier">;
|
def err_dup_virtual : Error<"duplicate 'virtual' in base specifier">;
|
||||||
@ -560,7 +560,7 @@ def warn_cxx98_compat_nullptr : Warning<
|
|||||||
|
|
||||||
def warn_cxx14_compat_attribute : Warning<
|
def warn_cxx14_compat_attribute : Warning<
|
||||||
"attributes on %select{a namespace|an enumerator}0 declaration are "
|
"attributes on %select{a namespace|an enumerator}0 declaration are "
|
||||||
"incompatible with C++ standards before C++1z">,
|
"incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def warn_cxx98_compat_alignas : Warning<"'alignas' is incompatible with C++98">,
|
def warn_cxx98_compat_alignas : Warning<"'alignas' is incompatible with C++98">,
|
||||||
InGroup<CXX98Compat>, DefaultIgnore;
|
InGroup<CXX98Compat>, DefaultIgnore;
|
||||||
@ -577,10 +577,10 @@ def err_cxx11_attribute_repeated : Error<
|
|||||||
"attribute %0 cannot appear multiple times in an attribute specifier">;
|
"attribute %0 cannot appear multiple times in an attribute specifier">;
|
||||||
def warn_cxx14_compat_using_attribute_ns : Warning<
|
def warn_cxx14_compat_using_attribute_ns : Warning<
|
||||||
"default scope specifier for attributes is incompatible with C++ standards "
|
"default scope specifier for attributes is incompatible with C++ standards "
|
||||||
"before C++1z">, InGroup<CXXPre1zCompat>, DefaultIgnore;
|
"before C++17">, InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def ext_using_attribute_ns : ExtWarn<
|
def ext_using_attribute_ns : ExtWarn<
|
||||||
"default scope specifier for attributes is a C++1z extension">,
|
"default scope specifier for attributes is a C++17 extension">,
|
||||||
InGroup<CXX1z>;
|
InGroup<CXX17>;
|
||||||
def err_using_attribute_ns_conflict : Error<
|
def err_using_attribute_ns_conflict : Error<
|
||||||
"attribute with scope specifier cannot follow default scope specifier">;
|
"attribute with scope specifier cannot follow default scope specifier">;
|
||||||
def err_attributes_not_allowed : Error<"an attribute list cannot appear here">;
|
def err_attributes_not_allowed : Error<"an attribute list cannot appear here">;
|
||||||
@ -617,11 +617,11 @@ def err_expected_comma_greater : Error<
|
|||||||
def err_class_on_template_template_param : Error<
|
def err_class_on_template_template_param : Error<
|
||||||
"template template parameter requires 'class' after the parameter list">;
|
"template template parameter requires 'class' after the parameter list">;
|
||||||
def ext_template_template_param_typename : ExtWarn<
|
def ext_template_template_param_typename : ExtWarn<
|
||||||
"template template parameter using 'typename' is a C++1z extension">,
|
"template template parameter using 'typename' is a C++17 extension">,
|
||||||
InGroup<CXX1z>;
|
InGroup<CXX17>;
|
||||||
def warn_cxx14_compat_template_template_param_typename : Warning<
|
def warn_cxx14_compat_template_template_param_typename : Warning<
|
||||||
"template template parameter using 'typename' is "
|
"template template parameter using 'typename' is "
|
||||||
"incompatible with C++ standards before C++1z">,
|
"incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def err_template_spec_syntax_non_template : Error<
|
def err_template_spec_syntax_non_template : Error<
|
||||||
"identifier followed by '<' indicates a class template specialization but "
|
"identifier followed by '<' indicates a class template specialization but "
|
||||||
@ -695,10 +695,10 @@ def err_default_template_template_parameter_not_template : Error<
|
|||||||
"template">;
|
"template">;
|
||||||
|
|
||||||
def ext_fold_expression : ExtWarn<
|
def ext_fold_expression : ExtWarn<
|
||||||
"pack fold expression is a C++1z extension">,
|
"pack fold expression is a C++17 extension">,
|
||||||
InGroup<CXX1z>;
|
InGroup<CXX17>;
|
||||||
def warn_cxx14_compat_fold_expression : Warning<
|
def warn_cxx14_compat_fold_expression : Warning<
|
||||||
"pack fold expression is incompatible with C++ standards before C++1z">,
|
"pack fold expression is incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def err_expected_fold_operator : Error<
|
def err_expected_fold_operator : Error<
|
||||||
"expected a foldable binary operator in fold expression">;
|
"expected a foldable binary operator in fold expression">;
|
||||||
@ -751,16 +751,16 @@ def err_alias_declaration_pack_expansion : Error<
|
|||||||
// C++1z using-declaration pack expansions
|
// C++1z using-declaration pack expansions
|
||||||
def ext_multi_using_declaration : ExtWarn<
|
def ext_multi_using_declaration : ExtWarn<
|
||||||
"use of multiple declarators in a single using declaration is "
|
"use of multiple declarators in a single using declaration is "
|
||||||
"a C++1z extension">, InGroup<CXX1z>;
|
"a C++17 extension">, InGroup<CXX17>;
|
||||||
def warn_cxx1z_compat_multi_using_declaration : Warning<
|
def warn_cxx1z_compat_multi_using_declaration : Warning<
|
||||||
"use of multiple declarators in a single using declaration is "
|
"use of multiple declarators in a single using declaration is "
|
||||||
"incompatible with C++ standards before C++1z">,
|
"incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def ext_using_declaration_pack : ExtWarn<
|
def ext_using_declaration_pack : ExtWarn<
|
||||||
"pack expansion of using declaration is a C++1z extension">, InGroup<CXX1z>;
|
"pack expansion of using declaration is a C++17 extension">, InGroup<CXX17>;
|
||||||
def warn_cxx1z_compat_using_declaration_pack : Warning<
|
def warn_cxx1z_compat_using_declaration_pack : Warning<
|
||||||
"pack expansion using declaration is incompatible with C++ standards "
|
"pack expansion using declaration is incompatible with C++ standards "
|
||||||
"before C++1z">, InGroup<CXXPre1zCompat>, DefaultIgnore;
|
"before C++17">, InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
|
|
||||||
// C++11 override control
|
// C++11 override control
|
||||||
def ext_override_control_keyword : ExtWarn<
|
def ext_override_control_keyword : ExtWarn<
|
||||||
@ -817,10 +817,10 @@ def err_expected_star_this_capture : Error<
|
|||||||
|
|
||||||
// C++1z constexpr lambda expressions
|
// C++1z constexpr lambda expressions
|
||||||
def warn_cxx14_compat_constexpr_on_lambda : Warning<
|
def warn_cxx14_compat_constexpr_on_lambda : Warning<
|
||||||
"constexpr on lambda expressions is incompatible with C++ standards before C++1z">,
|
"constexpr on lambda expressions is incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def ext_constexpr_on_lambda_cxx1z : ExtWarn<
|
def ext_constexpr_on_lambda_cxx1z : ExtWarn<
|
||||||
"'constexpr' on lambda expressions is a C++1z extension">, InGroup<CXX1z>;
|
"'constexpr' on lambda expressions is a C++17 extension">, InGroup<CXX17>;
|
||||||
|
|
||||||
// Availability attribute
|
// Availability attribute
|
||||||
def err_expected_version : Error<
|
def err_expected_version : Error<
|
||||||
|
@ -211,9 +211,9 @@ def warn_auto_storage_class : Warning<
|
|||||||
|
|
||||||
def warn_deprecated_register : Warning<
|
def warn_deprecated_register : Warning<
|
||||||
"'register' storage class specifier is deprecated "
|
"'register' storage class specifier is deprecated "
|
||||||
"and incompatible with C++1z">, InGroup<DeprecatedRegister>;
|
"and incompatible with C++17">, InGroup<DeprecatedRegister>;
|
||||||
def ext_register_storage_class : ExtWarn<
|
def ext_register_storage_class : ExtWarn<
|
||||||
"ISO C++1z does not allow 'register' storage class specifier">,
|
"ISO C++17 does not allow 'register' storage class specifier">,
|
||||||
DefaultError, InGroup<Register>;
|
DefaultError, InGroup<Register>;
|
||||||
|
|
||||||
def err_invalid_decl_spec_combination : Error<
|
def err_invalid_decl_spec_combination : Error<
|
||||||
@ -391,9 +391,9 @@ def err_decomp_decl_context : Error<
|
|||||||
"decomposition declaration not permitted in this context">;
|
"decomposition declaration not permitted in this context">;
|
||||||
def warn_cxx14_compat_decomp_decl : Warning<
|
def warn_cxx14_compat_decomp_decl : Warning<
|
||||||
"decomposition declarations are incompatible with "
|
"decomposition declarations are incompatible with "
|
||||||
"C++ standards before C++1z">, DefaultIgnore, InGroup<CXXPre1zCompat>;
|
"C++ standards before C++17">, DefaultIgnore, InGroup<CXXPre1zCompat>;
|
||||||
def ext_decomp_decl : ExtWarn<
|
def ext_decomp_decl : ExtWarn<
|
||||||
"decomposition declarations are a C++1z extension">, InGroup<CXX1z>;
|
"decomposition declarations are a C++17 extension">, InGroup<CXX17>;
|
||||||
def err_decomp_decl_spec : Error<
|
def err_decomp_decl_spec : Error<
|
||||||
"decomposition declaration cannot be declared "
|
"decomposition declaration cannot be declared "
|
||||||
"%plural{1:'%1'|:with '%1' specifiers}0">;
|
"%plural{1:'%1'|:with '%1' specifiers}0">;
|
||||||
@ -494,7 +494,7 @@ def err_access_decl : Error<
|
|||||||
"ISO C++11 does not allow access declarations; "
|
"ISO C++11 does not allow access declarations; "
|
||||||
"use using declarations instead">;
|
"use using declarations instead">;
|
||||||
def ext_dynamic_exception_spec : ExtWarn<
|
def ext_dynamic_exception_spec : ExtWarn<
|
||||||
"ISO C++1z does not allow dynamic exception specifications">,
|
"ISO C++17 does not allow dynamic exception specifications">,
|
||||||
InGroup<DynamicExceptionSpec>, DefaultError;
|
InGroup<DynamicExceptionSpec>, DefaultError;
|
||||||
def warn_exception_spec_deprecated : Warning<
|
def warn_exception_spec_deprecated : Warning<
|
||||||
"dynamic exception specifications are deprecated">,
|
"dynamic exception specifications are deprecated">,
|
||||||
@ -507,7 +507,7 @@ def warn_deprecated_copy_operation : Warning<
|
|||||||
InGroup<Deprecated>, DefaultIgnore;
|
InGroup<Deprecated>, DefaultIgnore;
|
||||||
def warn_cxx1z_compat_exception_spec_in_signature : Warning<
|
def warn_cxx1z_compat_exception_spec_in_signature : Warning<
|
||||||
"mangled name of %0 will change in C++17 due to non-throwing exception "
|
"mangled name of %0 will change in C++17 due to non-throwing exception "
|
||||||
"specification in function signature">, InGroup<CXX1zCompatMangling>;
|
"specification in function signature">, InGroup<CXX17CompatMangling>;
|
||||||
|
|
||||||
def warn_global_constructor : Warning<
|
def warn_global_constructor : Warning<
|
||||||
"declaration requires a global constructor">,
|
"declaration requires a global constructor">,
|
||||||
@ -1200,15 +1200,15 @@ def err_static_assert_expression_is_not_constant : Error<
|
|||||||
"static_assert expression is not an integral constant expression">;
|
"static_assert expression is not an integral constant expression">;
|
||||||
def err_static_assert_failed : Error<"static_assert failed%select{ %1|}0">;
|
def err_static_assert_failed : Error<"static_assert failed%select{ %1|}0">;
|
||||||
def ext_static_assert_no_message : ExtWarn<
|
def ext_static_assert_no_message : ExtWarn<
|
||||||
"static_assert with no message is a C++1z extension">, InGroup<CXX1z>;
|
"static_assert with no message is a C++17 extension">, InGroup<CXX17>;
|
||||||
def warn_cxx14_compat_static_assert_no_message : Warning<
|
def warn_cxx14_compat_static_assert_no_message : Warning<
|
||||||
"static_assert with no message is incompatible with C++ standards before C++1z">,
|
"static_assert with no message is incompatible with C++ standards before C++17">,
|
||||||
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
||||||
|
|
||||||
def ext_inline_variable : ExtWarn<
|
def ext_inline_variable : ExtWarn<
|
||||||
"inline variables are a C++1z extension">, InGroup<CXX1z>;
|
"inline variables are a C++17 extension">, InGroup<CXX17>;
|
||||||
def warn_cxx14_compat_inline_variable : Warning<
|
def warn_cxx14_compat_inline_variable : Warning<
|
||||||
"inline variables are incompatible with C++ standards before C++1z">,
|
"inline variables are incompatible with C++ standards before C++17">,
|
||||||
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
||||||
|
|
||||||
def warn_inline_namespace_reopened_noninline : Warning<
|
def warn_inline_namespace_reopened_noninline : Warning<
|
||||||
@ -1922,7 +1922,7 @@ def err_auto_not_allowed : Error<
|
|||||||
"|in non-static struct member|in struct member"
|
"|in non-static struct member|in struct member"
|
||||||
"|in non-static union member|in union member"
|
"|in non-static union member|in union member"
|
||||||
"|in non-static class member|in interface member"
|
"|in non-static class member|in interface member"
|
||||||
"|in exception declaration|in template parameter until C++1z|in block literal"
|
"|in exception declaration|in template parameter until C++17|in block literal"
|
||||||
"|in template argument|in typedef|in type alias|in function return type"
|
"|in template argument|in typedef|in type alias|in function return type"
|
||||||
"|in conversion function type|here|in lambda parameter"
|
"|in conversion function type|here|in lambda parameter"
|
||||||
"|in type allocated by 'new'|in K&R-style function parameter"
|
"|in type allocated by 'new'|in K&R-style function parameter"
|
||||||
@ -2147,11 +2147,11 @@ def err_for_range_iter_deduction_failure : Error<
|
|||||||
def err_for_range_member_begin_end_mismatch : Error<
|
def err_for_range_member_begin_end_mismatch : Error<
|
||||||
"range type %0 has '%select{begin|end}1' member but no '%select{end|begin}1' member">;
|
"range type %0 has '%select{begin|end}1' member but no '%select{end|begin}1' member">;
|
||||||
def ext_for_range_begin_end_types_differ : ExtWarn<
|
def ext_for_range_begin_end_types_differ : ExtWarn<
|
||||||
"'begin' and 'end' returning different types (%0 and %1) is a C++1z extension">,
|
"'begin' and 'end' returning different types (%0 and %1) is a C++17 extension">,
|
||||||
InGroup<CXX1z>;
|
InGroup<CXX17>;
|
||||||
def warn_for_range_begin_end_types_differ : Warning<
|
def warn_for_range_begin_end_types_differ : Warning<
|
||||||
"'begin' and 'end' returning different types (%0 and %1) is incompatible "
|
"'begin' and 'end' returning different types (%0 and %1) is incompatible "
|
||||||
"with C++ standards before C++1z">, InGroup<CXXPre1zCompat>, DefaultIgnore;
|
"with C++ standards before C++17">, InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def note_in_for_range: Note<
|
def note_in_for_range: Note<
|
||||||
"when looking up '%select{begin|end}0' function for range expression "
|
"when looking up '%select{begin|end}0' function for range expression "
|
||||||
"of type %1">;
|
"of type %1">;
|
||||||
@ -3905,7 +3905,7 @@ def err_template_nontype_parm_bad_type : Error<
|
|||||||
"a non-type template parameter cannot have type %0">;
|
"a non-type template parameter cannot have type %0">;
|
||||||
def warn_cxx14_compat_template_nontype_parm_auto_type : Warning<
|
def warn_cxx14_compat_template_nontype_parm_auto_type : Warning<
|
||||||
"non-type template parameters declared with %0 are incompatible with C++ "
|
"non-type template parameters declared with %0 are incompatible with C++ "
|
||||||
"standards before C++1z">,
|
"standards before C++17">,
|
||||||
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
||||||
def err_template_param_default_arg_redefinition : Error<
|
def err_template_param_default_arg_redefinition : Error<
|
||||||
"template parameter redefines default argument">;
|
"template parameter redefines default argument">;
|
||||||
@ -6337,9 +6337,9 @@ def note_member_first_declared_here : Note<
|
|||||||
def err_decrement_bool : Error<"cannot decrement expression of type bool">;
|
def err_decrement_bool : Error<"cannot decrement expression of type bool">;
|
||||||
def warn_increment_bool : Warning<
|
def warn_increment_bool : Warning<
|
||||||
"incrementing expression of type bool is deprecated and "
|
"incrementing expression of type bool is deprecated and "
|
||||||
"incompatible with C++1z">, InGroup<DeprecatedIncrementBool>;
|
"incompatible with C++17">, InGroup<DeprecatedIncrementBool>;
|
||||||
def ext_increment_bool : ExtWarn<
|
def ext_increment_bool : ExtWarn<
|
||||||
"ISO C++1z does not allow incrementing expression of type bool">,
|
"ISO C++17 does not allow incrementing expression of type bool">,
|
||||||
DefaultError, InGroup<IncrementBool>;
|
DefaultError, InGroup<IncrementBool>;
|
||||||
def err_increment_decrement_enum : Error<
|
def err_increment_decrement_enum : Error<
|
||||||
"cannot %select{decrement|increment}0 expression of enum type %1">;
|
"cannot %select{decrement|increment}0 expression of enum type %1">;
|
||||||
@ -6528,10 +6528,10 @@ let CategoryName = "Lambda Issue" in {
|
|||||||
|
|
||||||
// C++1z '*this' captures.
|
// C++1z '*this' captures.
|
||||||
def warn_cxx14_compat_star_this_lambda_capture : Warning<
|
def warn_cxx14_compat_star_this_lambda_capture : Warning<
|
||||||
"by value capture of '*this' is incompatible with C++ standards before C++1z">,
|
"by value capture of '*this' is incompatible with C++ standards before C++17">,
|
||||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||||
def ext_star_this_lambda_capture_cxx1z : ExtWarn<
|
def ext_star_this_lambda_capture_cxx1z : ExtWarn<
|
||||||
"capture of '*this' by copy is a C++1z extension">, InGroup<CXX1z>;
|
"capture of '*this' by copy is a C++17 extension">, InGroup<CXX17>;
|
||||||
}
|
}
|
||||||
|
|
||||||
def err_return_in_captured_stmt : Error<
|
def err_return_in_captured_stmt : Error<
|
||||||
@ -7200,7 +7200,7 @@ def warn_unused_volatile : Warning<
|
|||||||
def ext_cxx14_attr : Extension<
|
def ext_cxx14_attr : Extension<
|
||||||
"use of the %0 attribute is a C++14 extension">, InGroup<CXX14>;
|
"use of the %0 attribute is a C++14 extension">, InGroup<CXX14>;
|
||||||
def ext_cxx1z_attr : Extension<
|
def ext_cxx1z_attr : Extension<
|
||||||
"use of the %0 attribute is a C++1z extension">, InGroup<CXX1z>;
|
"use of the %0 attribute is a C++17 extension">, InGroup<CXX17>;
|
||||||
|
|
||||||
def warn_unused_comparison : Warning<
|
def warn_unused_comparison : Warning<
|
||||||
"%select{%select{|in}1equality|relational}0 comparison result unused">,
|
"%select{%select{|in}1equality|relational}0 comparison result unused">,
|
||||||
|
@ -2019,6 +2019,10 @@ def mdspr2 : Flag<["-"], "mdspr2">, Group<m_Group>;
|
|||||||
def mno_dspr2 : Flag<["-"], "mno-dspr2">, Group<m_Group>;
|
def mno_dspr2 : Flag<["-"], "mno-dspr2">, Group<m_Group>;
|
||||||
def msingle_float : Flag<["-"], "msingle-float">, Group<m_Group>;
|
def msingle_float : Flag<["-"], "msingle-float">, Group<m_Group>;
|
||||||
def mdouble_float : Flag<["-"], "mdouble-float">, Group<m_Group>;
|
def mdouble_float : Flag<["-"], "mdouble-float">, Group<m_Group>;
|
||||||
|
def mmadd4 : Flag<["-"], "mmadd4">, Group<m_Group>,
|
||||||
|
HelpText<"Enable the generation of 4-operand madd.s, madd.d and related instructions.">;
|
||||||
|
def mno_madd4 : Flag<["-"], "mno-madd4">, Group<m_Group>,
|
||||||
|
HelpText<"Disable the generation of 4-operand madd.s, madd.d and related instructions.">;
|
||||||
def mmsa : Flag<["-"], "mmsa">, Group<m_Group>,
|
def mmsa : Flag<["-"], "mmsa">, Group<m_Group>,
|
||||||
HelpText<"Enable MSA ASE (MIPS only)">;
|
HelpText<"Enable MSA ASE (MIPS only)">;
|
||||||
def mno_msa : Flag<["-"], "mno-msa">, Group<m_Group>,
|
def mno_msa : Flag<["-"], "mno-msa">, Group<m_Group>,
|
||||||
|
@ -315,7 +315,7 @@ class ToolChain {
|
|||||||
|
|
||||||
/// IsUnwindTablesDefault - Does this tool chain use -funwind-tables
|
/// IsUnwindTablesDefault - Does this tool chain use -funwind-tables
|
||||||
/// by default.
|
/// by default.
|
||||||
virtual bool IsUnwindTablesDefault() const;
|
virtual bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const;
|
||||||
|
|
||||||
/// \brief Test whether this toolchain defaults to PIC.
|
/// \brief Test whether this toolchain defaults to PIC.
|
||||||
virtual bool isPICDefault() const = 0;
|
virtual bool isPICDefault() const = 0;
|
||||||
|
@ -109,15 +109,17 @@ LANGSTANDARD(gnucxx14, "gnu++14",
|
|||||||
GNUMode)
|
GNUMode)
|
||||||
LANGSTANDARD_ALIAS_DEPR(gnucxx14, "gnu++1y")
|
LANGSTANDARD_ALIAS_DEPR(gnucxx14, "gnu++1y")
|
||||||
|
|
||||||
LANGSTANDARD(cxx1z, "c++1z",
|
LANGSTANDARD(cxx17, "c++17",
|
||||||
CXX, "Working draft for ISO C++ 2017",
|
CXX, "ISO C++ 2017 with amendments",
|
||||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
||||||
Digraphs | HexFloat)
|
Digraphs | HexFloat)
|
||||||
|
LANGSTANDARD_ALIAS_DEPR(cxx17, "c++1z")
|
||||||
|
|
||||||
LANGSTANDARD(gnucxx1z, "gnu++1z",
|
LANGSTANDARD(gnucxx17, "gnu++17",
|
||||||
CXX, "Working draft for ISO C++ 2017 with GNU extensions",
|
CXX, "ISO C++ 2017 with amendments and GNU extensions",
|
||||||
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
LineComment | CPlusPlus | CPlusPlus11 | CPlusPlus14 | CPlusPlus1z |
|
||||||
Digraphs | HexFloat | GNUMode)
|
Digraphs | HexFloat | GNUMode)
|
||||||
|
LANGSTANDARD_ALIAS_DEPR(gnucxx17, "gnu++1z")
|
||||||
|
|
||||||
LANGSTANDARD(cxx2a, "c++2a",
|
LANGSTANDARD(cxx2a, "c++2a",
|
||||||
CXX, "Working draft for ISO C++ 2020",
|
CXX, "Working draft for ISO C++ 2020",
|
||||||
|
@ -1837,9 +1837,10 @@ bool CXXMethodDecl::hasInlineBody() const {
|
|||||||
const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
|
const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
|
||||||
if (!CheckFn)
|
if (!CheckFn)
|
||||||
CheckFn = this;
|
CheckFn = this;
|
||||||
|
|
||||||
const FunctionDecl *fn;
|
const FunctionDecl *fn;
|
||||||
return CheckFn->hasBody(fn) && !fn->isOutOfLine();
|
return CheckFn->isDefined(fn) && !fn->isOutOfLine() &&
|
||||||
|
(fn->doesThisDeclarationHaveABody() || fn->willHaveBody());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CXXMethodDecl::isLambdaStaticInvoker() const {
|
bool CXXMethodDecl::isLambdaStaticInvoker() const {
|
||||||
|
@ -1052,7 +1052,9 @@ CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
|
|||||||
:Type->getType()->isRValueReferenceType()? VK_XValue
|
:Type->getType()->isRValueReferenceType()? VK_XValue
|
||||||
:VK_RValue),
|
:VK_RValue),
|
||||||
OK_Ordinary,
|
OK_Ordinary,
|
||||||
Type->getType()->isDependentType(), true, true,
|
Type->getType()->isDependentType() ||
|
||||||
|
Type->getType()->getContainedDeducedType(),
|
||||||
|
true, true,
|
||||||
Type->getType()->containsUnexpandedParameterPack()),
|
Type->getType()->containsUnexpandedParameterPack()),
|
||||||
Type(Type),
|
Type(Type),
|
||||||
LParenLoc(LParenLoc),
|
LParenLoc(LParenLoc),
|
||||||
|
@ -9788,6 +9788,8 @@ class VoidExprEvaluator
|
|||||||
|
|
||||||
bool Success(const APValue &V, const Expr *e) { return true; }
|
bool Success(const APValue &V, const Expr *e) { return true; }
|
||||||
|
|
||||||
|
bool ZeroInitialization(const Expr *E) { return true; }
|
||||||
|
|
||||||
bool VisitCastExpr(const CastExpr *E) {
|
bool VisitCastExpr(const CastExpr *E) {
|
||||||
switch (E->getCastKind()) {
|
switch (E->getCastKind()) {
|
||||||
default:
|
default:
|
||||||
|
@ -8050,6 +8050,7 @@ class MipsTargetInfo : public TargetInfo {
|
|||||||
NoDSP, DSP1, DSP2
|
NoDSP, DSP1, DSP2
|
||||||
} DspRev;
|
} DspRev;
|
||||||
bool HasMSA;
|
bool HasMSA;
|
||||||
|
bool DisableMadd4;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool HasFP64;
|
bool HasFP64;
|
||||||
@ -8060,7 +8061,7 @@ class MipsTargetInfo : public TargetInfo {
|
|||||||
: TargetInfo(Triple), IsMips16(false), IsMicromips(false),
|
: TargetInfo(Triple), IsMips16(false), IsMicromips(false),
|
||||||
IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
|
IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
|
||||||
CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
|
CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
|
||||||
HasMSA(false), HasFP64(false) {
|
HasMSA(false), DisableMadd4(false), HasFP64(false) {
|
||||||
TheCXXABI.set(TargetCXXABI::GenericMIPS);
|
TheCXXABI.set(TargetCXXABI::GenericMIPS);
|
||||||
|
|
||||||
setABI((getTriple().getArch() == llvm::Triple::mips ||
|
setABI((getTriple().getArch() == llvm::Triple::mips ||
|
||||||
@ -8306,6 +8307,9 @@ class MipsTargetInfo : public TargetInfo {
|
|||||||
if (HasMSA)
|
if (HasMSA)
|
||||||
Builder.defineMacro("__mips_msa", Twine(1));
|
Builder.defineMacro("__mips_msa", Twine(1));
|
||||||
|
|
||||||
|
if (DisableMadd4)
|
||||||
|
Builder.defineMacro("__mips_no_madd4", Twine(1));
|
||||||
|
|
||||||
Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
|
Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
|
||||||
Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
|
Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
|
||||||
Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
|
Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
|
||||||
@ -8468,6 +8472,8 @@ class MipsTargetInfo : public TargetInfo {
|
|||||||
DspRev = std::max(DspRev, DSP2);
|
DspRev = std::max(DspRev, DSP2);
|
||||||
else if (Feature == "+msa")
|
else if (Feature == "+msa")
|
||||||
HasMSA = true;
|
HasMSA = true;
|
||||||
|
else if (Feature == "+nomadd4")
|
||||||
|
DisableMadd4 = true;
|
||||||
else if (Feature == "+fp64")
|
else if (Feature == "+fp64")
|
||||||
HasFP64 = true;
|
HasFP64 = true;
|
||||||
else if (Feature == "-fp64")
|
else if (Feature == "-fp64")
|
||||||
|
@ -5573,17 +5573,14 @@ void ARMABIInfo::setCCs() {
|
|||||||
// AAPCS apparently requires runtime support functions to be soft-float, but
|
// AAPCS apparently requires runtime support functions to be soft-float, but
|
||||||
// that's almost certainly for historic reasons (Thumb1 not supporting VFP
|
// that's almost certainly for historic reasons (Thumb1 not supporting VFP
|
||||||
// most likely). It's more convenient for AAPCS16_VFP to be hard-float.
|
// most likely). It's more convenient for AAPCS16_VFP to be hard-float.
|
||||||
switch (getABIKind()) {
|
|
||||||
case APCS:
|
// The Run-time ABI for the ARM Architecture section 4.1.2 requires
|
||||||
case AAPCS16_VFP:
|
// AEABI-complying FP helper functions to use the base AAPCS.
|
||||||
if (abiCC != getLLVMDefaultCC())
|
// These AEABI functions are expanded in the ARM llvm backend, all the builtin
|
||||||
|
// support functions emitted by clang such as the _Complex helpers follow the
|
||||||
|
// abiCC.
|
||||||
|
if (abiCC != getLLVMDefaultCC())
|
||||||
BuiltinCC = abiCC;
|
BuiltinCC = abiCC;
|
||||||
break;
|
|
||||||
case AAPCS:
|
|
||||||
case AAPCS_VFP:
|
|
||||||
BuiltinCC = llvm::CallingConv::ARM_AAPCS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty,
|
ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty,
|
||||||
@ -6754,14 +6751,6 @@ MipsABIInfo::classifyArgumentType(QualType Ty, uint64_t &Offset) const {
|
|||||||
return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
|
return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use indirect if the aggregate cannot fit into registers for
|
|
||||||
// passing arguments according to the ABI
|
|
||||||
unsigned Threshold = IsO32 ? 16 : 64;
|
|
||||||
|
|
||||||
if(getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(Threshold))
|
|
||||||
return ABIArgInfo::getIndirect(CharUnits::fromQuantity(Align), true,
|
|
||||||
getContext().getTypeAlign(Ty) / 8 > Align);
|
|
||||||
|
|
||||||
// If we have reached here, aggregates are passed directly by coercing to
|
// If we have reached here, aggregates are passed directly by coercing to
|
||||||
// another structure type. Padding is inserted if the offset of the
|
// another structure type. Padding is inserted if the offset of the
|
||||||
// aggregate is unaligned.
|
// aggregate is unaligned.
|
||||||
|
@ -217,7 +217,7 @@ StringRef ToolChain::getDefaultUniversalArchName() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ToolChain::IsUnwindTablesDefault() const {
|
bool ToolChain::IsUnwindTablesDefault(const ArgList &Args) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,6 +297,8 @@ void mips::getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
|
|||||||
|
|
||||||
AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
|
AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
|
||||||
options::OPT_modd_spreg, "nooddspreg");
|
options::OPT_modd_spreg, "nooddspreg");
|
||||||
|
AddTargetFeature(Args, Features, options::OPT_mno_madd4, options::OPT_mmadd4,
|
||||||
|
"nomadd4");
|
||||||
AddTargetFeature(Args, Features, options::OPT_mlong_calls,
|
AddTargetFeature(Args, Features, options::OPT_mlong_calls,
|
||||||
options::OPT_mno_long_calls, "long-calls");
|
options::OPT_mno_long_calls, "long-calls");
|
||||||
AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,"mt");
|
AddTargetFeature(Args, Features, options::OPT_mmt, options::OPT_mno_mt,"mt");
|
||||||
|
@ -2538,7 +2538,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||||||
bool AsynchronousUnwindTables =
|
bool AsynchronousUnwindTables =
|
||||||
Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
|
Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
|
||||||
options::OPT_fno_asynchronous_unwind_tables,
|
options::OPT_fno_asynchronous_unwind_tables,
|
||||||
(getToolChain().IsUnwindTablesDefault() ||
|
(getToolChain().IsUnwindTablesDefault(Args) ||
|
||||||
getToolChain().getSanitizerArgs().needsUnwindTables()) &&
|
getToolChain().getSanitizerArgs().needsUnwindTables()) &&
|
||||||
!KernelOrKext);
|
!KernelOrKext);
|
||||||
if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
|
if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
|
||||||
|
@ -214,7 +214,7 @@ CrossWindowsToolChain::CrossWindowsToolChain(const Driver &D,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CrossWindowsToolChain::IsUnwindTablesDefault() const {
|
bool CrossWindowsToolChain::IsUnwindTablesDefault(const ArgList &Args) const {
|
||||||
// FIXME: all non-x86 targets need unwind tables, however, LLVM currently does
|
// FIXME: all non-x86 targets need unwind tables, however, LLVM currently does
|
||||||
// not know how to emit them.
|
// not know how to emit them.
|
||||||
return getArch() == llvm::Triple::x86_64;
|
return getArch() == llvm::Triple::x86_64;
|
||||||
|
@ -56,7 +56,7 @@ class LLVM_LIBRARY_VISIBILITY CrossWindowsToolChain : public Generic_GCC {
|
|||||||
const llvm::opt::ArgList &Args);
|
const llvm::opt::ArgList &Args);
|
||||||
|
|
||||||
bool IsIntegratedAssemblerDefault() const override { return true; }
|
bool IsIntegratedAssemblerDefault() const override { return true; }
|
||||||
bool IsUnwindTablesDefault() const override;
|
bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override;
|
||||||
bool isPICDefault() const override;
|
bool isPICDefault() const override;
|
||||||
bool isPIEDefault() const override;
|
bool isPIEDefault() const override;
|
||||||
bool isPICDefaultForced() const override;
|
bool isPICDefaultForced() const override;
|
||||||
|
@ -1174,13 +1174,12 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
|
|||||||
unsigned Major, Minor, Micro;
|
unsigned Major, Minor, Micro;
|
||||||
bool HadExtra;
|
bool HadExtra;
|
||||||
|
|
||||||
// iOS 10 is the maximum deployment target for 32-bit targets.
|
// The iOS deployment target that is explicitly specified via a command line
|
||||||
if (iOSVersion && getTriple().isArch32Bit() &&
|
// option or an environment variable.
|
||||||
Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
|
std::string ExplicitIOSDeploymentTargetStr;
|
||||||
HadExtra) &&
|
|
||||||
Major > 10)
|
if (iOSVersion)
|
||||||
getDriver().Diag(diag::err_invalid_ios_deployment_target)
|
ExplicitIOSDeploymentTargetStr = iOSVersion->getAsString(Args);
|
||||||
<< iOSVersion->getAsString(Args);
|
|
||||||
|
|
||||||
// Add a macro to differentiate between m(iphone|tv|watch)os-version-min=X.Y and
|
// Add a macro to differentiate between m(iphone|tv|watch)os-version-min=X.Y and
|
||||||
// -m(iphone|tv|watch)simulator-version-min=X.Y.
|
// -m(iphone|tv|watch)simulator-version-min=X.Y.
|
||||||
@ -1223,13 +1222,9 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
|
|||||||
if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
|
if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
|
||||||
WatchOSTarget = env;
|
WatchOSTarget = env;
|
||||||
|
|
||||||
// iOS 10 is the maximum deployment target for 32-bit targets.
|
if (!iOSTarget.empty())
|
||||||
if (!iOSTarget.empty() && getTriple().isArch32Bit() &&
|
ExplicitIOSDeploymentTargetStr =
|
||||||
Driver::GetReleaseVersion(iOSTarget.c_str(), Major, Minor, Micro,
|
std::string("IPHONEOS_DEPLOYMENT_TARGET=") + iOSTarget;
|
||||||
HadExtra) &&
|
|
||||||
Major > 10)
|
|
||||||
getDriver().Diag(diag::err_invalid_ios_deployment_target)
|
|
||||||
<< std::string("IPHONEOS_DEPLOYMENT_TARGET=") + iOSTarget;
|
|
||||||
|
|
||||||
// If there is no command-line argument to specify the Target version and
|
// If there is no command-line argument to specify the Target version and
|
||||||
// no environment variable defined, see if we can set the default based
|
// no environment variable defined, see if we can set the default based
|
||||||
@ -1393,12 +1388,19 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
|
|||||||
HadExtra || Major >= 100 || Minor >= 100 || Micro >= 100)
|
HadExtra || Major >= 100 || Minor >= 100 || Micro >= 100)
|
||||||
getDriver().Diag(diag::err_drv_invalid_version_number)
|
getDriver().Diag(diag::err_drv_invalid_version_number)
|
||||||
<< iOSVersion->getAsString(Args);
|
<< iOSVersion->getAsString(Args);
|
||||||
// iOS 10 is the maximum deployment target for 32-bit targets. If the
|
// For 32-bit targets, the deployment target for iOS has to be earlier than
|
||||||
// inferred deployment target is iOS 11 or later, set it to 10.99.
|
// iOS 11.
|
||||||
if (getTriple().isArch32Bit() && Major >= 11) {
|
if (getTriple().isArch32Bit() && Major >= 11) {
|
||||||
Major = 10;
|
// If the deployment target is explicitly specified, print a diagnostic.
|
||||||
Minor = 99;
|
if (!ExplicitIOSDeploymentTargetStr.empty()) {
|
||||||
Micro = 99;
|
getDriver().Diag(diag::warn_invalid_ios_deployment_target)
|
||||||
|
<< ExplicitIOSDeploymentTargetStr;
|
||||||
|
// Otherwise, set it to 10.99.99.
|
||||||
|
} else {
|
||||||
|
Major = 10;
|
||||||
|
Minor = 99;
|
||||||
|
Micro = 99;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (Platform == TvOS) {
|
} else if (Platform == TvOS) {
|
||||||
if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
|
if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
|
||||||
@ -1834,8 +1836,8 @@ Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
|
|||||||
return DAL;
|
return DAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MachO::IsUnwindTablesDefault() const {
|
bool MachO::IsUnwindTablesDefault(const ArgList &Args) const {
|
||||||
return getArch() == llvm::Triple::x86_64;
|
return !UseSjLjExceptions(Args);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MachO::UseDwarfDebugFlags() const {
|
bool MachO::UseDwarfDebugFlags() const {
|
||||||
|
@ -216,7 +216,7 @@ class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain {
|
|||||||
|
|
||||||
bool UseObjCMixedDispatch() const override { return true; }
|
bool UseObjCMixedDispatch() const override { return true; }
|
||||||
|
|
||||||
bool IsUnwindTablesDefault() const override;
|
bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override;
|
||||||
|
|
||||||
RuntimeLibType GetDefaultRuntimeLibType() const override {
|
RuntimeLibType GetDefaultRuntimeLibType() const override {
|
||||||
return ToolChain::RLT_CompilerRT;
|
return ToolChain::RLT_CompilerRT;
|
||||||
|
@ -2291,7 +2291,7 @@ void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
|
|||||||
CudaInstallation.print(OS);
|
CudaInstallation.print(OS);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Generic_GCC::IsUnwindTablesDefault() const {
|
bool Generic_GCC::IsUnwindTablesDefault(const ArgList &Args) const {
|
||||||
return getArch() == llvm::Triple::x86_64;
|
return getArch() == llvm::Triple::x86_64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain {
|
|||||||
|
|
||||||
void printVerboseInfo(raw_ostream &OS) const override;
|
void printVerboseInfo(raw_ostream &OS) const override;
|
||||||
|
|
||||||
bool IsUnwindTablesDefault() const override;
|
bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override;
|
||||||
bool isPICDefault() const override;
|
bool isPICDefault() const override;
|
||||||
bool isPIEDefault() const override;
|
bool isPIEDefault() const override;
|
||||||
bool isPICDefaultForced() const override;
|
bool isPICDefaultForced() const override;
|
||||||
|
@ -699,7 +699,7 @@ bool MSVCToolChain::IsIntegratedAssemblerDefault() const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MSVCToolChain::IsUnwindTablesDefault() const {
|
bool MSVCToolChain::IsUnwindTablesDefault(const ArgList &Args) const {
|
||||||
// Emit unwind tables by default on Win64. All non-x86_32 Windows platforms
|
// Emit unwind tables by default on Win64. All non-x86_32 Windows platforms
|
||||||
// such as ARM and PPC actually require unwind tables, but LLVM doesn't know
|
// such as ARM and PPC actually require unwind tables, but LLVM doesn't know
|
||||||
// how to generate them yet.
|
// how to generate them yet.
|
||||||
|
@ -73,7 +73,7 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain {
|
|||||||
Action::OffloadKind DeviceOffloadKind) const override;
|
Action::OffloadKind DeviceOffloadKind) const override;
|
||||||
|
|
||||||
bool IsIntegratedAssemblerDefault() const override;
|
bool IsIntegratedAssemblerDefault() const override;
|
||||||
bool IsUnwindTablesDefault() const override;
|
bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override;
|
||||||
bool isPICDefault() const override;
|
bool isPICDefault() const override;
|
||||||
bool isPIEDefault() const override;
|
bool isPIEDefault() const override;
|
||||||
bool isPICDefaultForced() const override;
|
bool isPICDefaultForced() const override;
|
||||||
|
@ -347,7 +347,7 @@ Tool *toolchains::MinGW::buildLinker() const {
|
|||||||
return new tools::MinGW::Linker(*this);
|
return new tools::MinGW::Linker(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool toolchains::MinGW::IsUnwindTablesDefault() const {
|
bool toolchains::MinGW::IsUnwindTablesDefault(const ArgList &Args) const {
|
||||||
return getArch() == llvm::Triple::x86_64;
|
return getArch() == llvm::Triple::x86_64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ class LLVM_LIBRARY_VISIBILITY MinGW : public ToolChain {
|
|||||||
const llvm::opt::ArgList &Args);
|
const llvm::opt::ArgList &Args);
|
||||||
|
|
||||||
bool IsIntegratedAssemblerDefault() const override;
|
bool IsIntegratedAssemblerDefault() const override;
|
||||||
bool IsUnwindTablesDefault() const override;
|
bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override;
|
||||||
bool isPICDefault() const override;
|
bool isPICDefault() const override;
|
||||||
bool isPIEDefault() const override;
|
bool isPIEDefault() const override;
|
||||||
bool isPICDefaultForced() const override;
|
bool isPICDefaultForced() const override;
|
||||||
|
@ -65,7 +65,10 @@ class LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF {
|
|||||||
const llvm::opt::ArgList &DriverArgs,
|
const llvm::opt::ArgList &DriverArgs,
|
||||||
llvm::opt::ArgStringList &CC1Args) const override;
|
llvm::opt::ArgStringList &CC1Args) const override;
|
||||||
|
|
||||||
bool IsUnwindTablesDefault() const override { return true; }
|
bool IsUnwindTablesDefault(const llvm::opt::ArgList &Args) const override {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
SanitizerMask getSupportedSanitizers() const override;
|
SanitizerMask getSupportedSanitizers() const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -497,6 +497,8 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
|
|||||||
Builder.defineMacro("__cpp_ref_qualifiers", "200710");
|
Builder.defineMacro("__cpp_ref_qualifiers", "200710");
|
||||||
Builder.defineMacro("__cpp_alias_templates", "200704");
|
Builder.defineMacro("__cpp_alias_templates", "200704");
|
||||||
}
|
}
|
||||||
|
if (LangOpts.ThreadsafeStatics)
|
||||||
|
Builder.defineMacro("__cpp_threadsafe_static_init", "200806");
|
||||||
|
|
||||||
// C++14 features.
|
// C++14 features.
|
||||||
if (LangOpts.CPlusPlus14) {
|
if (LangOpts.CPlusPlus14) {
|
||||||
@ -519,6 +521,7 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
|
|||||||
Builder.defineMacro("__cpp_noexcept_function_type", "201510");
|
Builder.defineMacro("__cpp_noexcept_function_type", "201510");
|
||||||
Builder.defineMacro("__cpp_capture_star_this", "201603");
|
Builder.defineMacro("__cpp_capture_star_this", "201603");
|
||||||
Builder.defineMacro("__cpp_if_constexpr", "201606");
|
Builder.defineMacro("__cpp_if_constexpr", "201606");
|
||||||
|
Builder.defineMacro("__cpp_deduction_guides", "201611");
|
||||||
Builder.defineMacro("__cpp_template_auto", "201606");
|
Builder.defineMacro("__cpp_template_auto", "201606");
|
||||||
Builder.defineMacro("__cpp_namespace_attributes", "201411");
|
Builder.defineMacro("__cpp_namespace_attributes", "201411");
|
||||||
Builder.defineMacro("__cpp_enumerator_attributes", "201411");
|
Builder.defineMacro("__cpp_enumerator_attributes", "201411");
|
||||||
@ -528,8 +531,6 @@ static void InitializeCPlusPlusFeatureTestMacros(const LangOptions &LangOpts,
|
|||||||
Builder.defineMacro("__cpp_structured_bindings", "201606");
|
Builder.defineMacro("__cpp_structured_bindings", "201606");
|
||||||
Builder.defineMacro("__cpp_nontype_template_args", "201411");
|
Builder.defineMacro("__cpp_nontype_template_args", "201411");
|
||||||
Builder.defineMacro("__cpp_fold_expressions", "201603");
|
Builder.defineMacro("__cpp_fold_expressions", "201603");
|
||||||
// FIXME: This is not yet listed in SD-6.
|
|
||||||
Builder.defineMacro("__cpp_deduction_guides", "201611");
|
|
||||||
}
|
}
|
||||||
if (LangOpts.AlignedAllocation)
|
if (LangOpts.AlignedAllocation)
|
||||||
Builder.defineMacro("__cpp_aligned_new", "201606");
|
Builder.defineMacro("__cpp_aligned_new", "201606");
|
||||||
|
@ -166,20 +166,11 @@ NamedDecl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (FnD) {
|
if (FnD) {
|
||||||
// If this is a friend function, mark that it's late-parsed so that
|
FunctionDecl *FD = FnD->getAsFunction();
|
||||||
// it's still known to be a definition even before we attach the
|
// Track that this function will eventually have a body; Sema needs
|
||||||
// parsed body. Sema needs to treat friend function definitions
|
// to know this.
|
||||||
// differently during template instantiation, and it's possible for
|
Actions.CheckForFunctionRedefinition(FD);
|
||||||
// the containing class to be instantiated before all its member
|
FD->setWillHaveBody(true);
|
||||||
// function definitions are parsed.
|
|
||||||
//
|
|
||||||
// If you remove this, you can remove the code that clears the flag
|
|
||||||
// after parsing the member.
|
|
||||||
if (D.getDeclSpec().isFriendSpecified()) {
|
|
||||||
FunctionDecl *FD = FnD->getAsFunction();
|
|
||||||
Actions.CheckForFunctionRedefinition(FD);
|
|
||||||
FD->setLateTemplateParsed(true);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// If semantic analysis could not build a function declaration,
|
// If semantic analysis could not build a function declaration,
|
||||||
// just throw away the late-parsed declaration.
|
// just throw away the late-parsed declaration.
|
||||||
@ -558,10 +549,6 @@ void Parser::ParseLexedMethodDef(LexedMethod &LM) {
|
|||||||
|
|
||||||
ParseFunctionStatementBody(LM.D, FnScope);
|
ParseFunctionStatementBody(LM.D, FnScope);
|
||||||
|
|
||||||
// Clear the late-template-parsed bit if we set it before.
|
|
||||||
if (LM.D)
|
|
||||||
LM.D->getAsFunction()->setLateTemplateParsed(false);
|
|
||||||
|
|
||||||
while (Tok.isNot(tok::eof))
|
while (Tok.isNot(tok::eof))
|
||||||
ConsumeAnyToken();
|
ConsumeAnyToken();
|
||||||
|
|
||||||
|
@ -552,7 +552,14 @@ CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType,
|
|||||||
Qualifiers SrcQuals, DestQuals;
|
Qualifiers SrcQuals, DestQuals;
|
||||||
Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals);
|
Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals);
|
||||||
Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals);
|
Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals);
|
||||||
|
|
||||||
|
// We do not meaningfully track object const-ness of Objective-C object
|
||||||
|
// types. Remove const from the source type if either the source or
|
||||||
|
// the destination is an Objective-C object type.
|
||||||
|
if (UnwrappedSrcType->isObjCObjectType() ||
|
||||||
|
UnwrappedDestType->isObjCObjectType())
|
||||||
|
SrcQuals.removeConst();
|
||||||
|
|
||||||
Qualifiers RetainedSrcQuals, RetainedDestQuals;
|
Qualifiers RetainedSrcQuals, RetainedDestQuals;
|
||||||
if (CheckCVR) {
|
if (CheckCVR) {
|
||||||
RetainedSrcQuals.setCVRQualifiers(SrcQuals.getCVRQualifiers());
|
RetainedSrcQuals.setCVRQualifiers(SrcQuals.getCVRQualifiers());
|
||||||
|
@ -2401,10 +2401,7 @@ formatBlockPlaceholder(const PrintingPolicy &Policy, const NamedDecl *BlockDecl,
|
|||||||
static std::string GetDefaultValueString(const ParmVarDecl *Param,
|
static std::string GetDefaultValueString(const ParmVarDecl *Param,
|
||||||
const SourceManager &SM,
|
const SourceManager &SM,
|
||||||
const LangOptions &LangOpts) {
|
const LangOptions &LangOpts) {
|
||||||
const Expr *defaultArg = Param->getDefaultArg();
|
const SourceRange SrcRange = Param->getDefaultArgRange();
|
||||||
if (!defaultArg)
|
|
||||||
return "";
|
|
||||||
const SourceRange SrcRange = defaultArg->getSourceRange();
|
|
||||||
CharSourceRange CharSrcRange = CharSourceRange::getTokenRange(SrcRange);
|
CharSourceRange CharSrcRange = CharSourceRange::getTokenRange(SrcRange);
|
||||||
bool Invalid = CharSrcRange.isInvalid();
|
bool Invalid = CharSrcRange.isInvalid();
|
||||||
if (Invalid)
|
if (Invalid)
|
||||||
|
@ -6999,6 +6999,21 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cast<VarDecl>(ShadowedDecl)->hasLocalStorage()) {
|
||||||
|
// A variable can't shadow a local variable in an enclosing scope, if
|
||||||
|
// they are separated by a non-capturing declaration context.
|
||||||
|
for (DeclContext *ParentDC = NewDC;
|
||||||
|
ParentDC && !ParentDC->Equals(OldDC);
|
||||||
|
ParentDC = getLambdaAwareParentOfDeclContext(ParentDC)) {
|
||||||
|
// Only block literals, captured statements, and lambda expressions
|
||||||
|
// can capture; other scopes don't.
|
||||||
|
if (!isa<BlockDecl>(ParentDC) && !isa<CapturedDecl>(ParentDC) &&
|
||||||
|
!isLambdaCallOperator(ParentDC)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12075,8 +12090,9 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D,
|
|||||||
FD->setInvalidDecl();
|
FD->setInvalidDecl();
|
||||||
}
|
}
|
||||||
|
|
||||||
// See if this is a redefinition.
|
// See if this is a redefinition. If 'will have body' is already set, then
|
||||||
if (!FD->isLateTemplateParsed()) {
|
// these checks were already performed when it was set.
|
||||||
|
if (!FD->willHaveBody() && !FD->isLateTemplateParsed()) {
|
||||||
CheckForFunctionRedefinition(FD, nullptr, SkipBody);
|
CheckForFunctionRedefinition(FD, nullptr, SkipBody);
|
||||||
|
|
||||||
// If we're skipping the body, we're done. Don't enter the scope.
|
// If we're skipping the body, we're done. Don't enter the scope.
|
||||||
@ -13278,6 +13294,7 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
|
|||||||
AddMsStructLayoutForRecord(RD);
|
AddMsStructLayoutForRecord(RD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
New->setLexicalDeclContext(CurContext);
|
||||||
return New;
|
return New;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3771,6 +3771,8 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
|
|||||||
if (PatternDef) {
|
if (PatternDef) {
|
||||||
Pattern = PatternDef->getBody(PatternDef);
|
Pattern = PatternDef->getBody(PatternDef);
|
||||||
PatternDecl = PatternDef;
|
PatternDecl = PatternDef;
|
||||||
|
if (PatternDef->willHaveBody())
|
||||||
|
PatternDef = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: We need to track the instantiation stack in order to know which
|
// FIXME: We need to track the instantiation stack in order to know which
|
||||||
|
@ -458,8 +458,8 @@ static void createImportLibrary(bool AsLib) {
|
|||||||
std::vector<COFFShortExport> Exports;
|
std::vector<COFFShortExport> Exports;
|
||||||
for (Export &E1 : Config->Exports) {
|
for (Export &E1 : Config->Exports) {
|
||||||
COFFShortExport E2;
|
COFFShortExport E2;
|
||||||
// Use SymbolName, which will have any stdcall or fastcall qualifiers.
|
E2.Name = E1.Name;
|
||||||
E2.Name = E1.SymbolName;
|
E2.SymbolName = E1.SymbolName;
|
||||||
E2.ExtName = E1.ExtName;
|
E2.ExtName = E1.ExtName;
|
||||||
E2.Ordinal = E1.Ordinal;
|
E2.Ordinal = E1.Ordinal;
|
||||||
E2.Noname = E1.Noname;
|
E2.Noname = E1.Noname;
|
||||||
@ -470,7 +470,7 @@ static void createImportLibrary(bool AsLib) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
writeImportLibrary(getImportName(AsLib), getImplibPath(), Exports,
|
writeImportLibrary(getImportName(AsLib), getImplibPath(), Exports,
|
||||||
Config->Machine);
|
Config->Machine, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parseModuleDefs(StringRef Path) {
|
static void parseModuleDefs(StringRef Path) {
|
||||||
|
@ -639,7 +639,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
|||||||
Config->Fini = Args.getLastArgValue(OPT_fini, "_fini");
|
Config->Fini = Args.getLastArgValue(OPT_fini, "_fini");
|
||||||
Config->GcSections = getArg(Args, OPT_gc_sections, OPT_no_gc_sections, false);
|
Config->GcSections = getArg(Args, OPT_gc_sections, OPT_no_gc_sections, false);
|
||||||
Config->GdbIndex = Args.hasArg(OPT_gdb_index);
|
Config->GdbIndex = Args.hasArg(OPT_gdb_index);
|
||||||
Config->ICF = Args.hasArg(OPT_icf);
|
Config->ICF = getArg(Args, OPT_icf_all, OPT_icf_none, false);
|
||||||
Config->Init = Args.getLastArgValue(OPT_init, "_init");
|
Config->Init = Args.getLastArgValue(OPT_init, "_init");
|
||||||
Config->LTOAAPipeline = Args.getLastArgValue(OPT_lto_aa_pipeline);
|
Config->LTOAAPipeline = Args.getLastArgValue(OPT_lto_aa_pipeline);
|
||||||
Config->LTONewPmPasses = Args.getLastArgValue(OPT_lto_newpm_passes);
|
Config->LTONewPmPasses = Args.getLastArgValue(OPT_lto_newpm_passes);
|
||||||
|
@ -126,7 +126,9 @@ def hash_style: S<"hash-style">,
|
|||||||
|
|
||||||
def help: F<"help">, HelpText<"Print option help">;
|
def help: F<"help">, HelpText<"Print option help">;
|
||||||
|
|
||||||
def icf: F<"icf=all">, HelpText<"Enable identical code folding">;
|
def icf_all: F<"icf=all">, HelpText<"Enable identical code folding">;
|
||||||
|
|
||||||
|
def icf_none: F<"icf=none">, HelpText<"Disable identical code folding">;
|
||||||
|
|
||||||
def image_base : J<"image-base=">, HelpText<"Set the base address">;
|
def image_base : J<"image-base=">, HelpText<"Set the base address">;
|
||||||
|
|
||||||
|
@ -871,7 +871,7 @@ static void printRelocationTargetName(const MachOObjectFile *O,
|
|||||||
uint64_t Val = O->getPlainRelocationSymbolNum(RE);
|
uint64_t Val = O->getPlainRelocationSymbolNum(RE);
|
||||||
|
|
||||||
if (O->getAnyRelocationType(RE) == MachO::ARM64_RELOC_ADDEND) {
|
if (O->getAnyRelocationType(RE) == MachO::ARM64_RELOC_ADDEND) {
|
||||||
fmt << format("0x%x", Val);
|
fmt << format("0x%0" PRIx64, Val);
|
||||||
return;
|
return;
|
||||||
} else if (isExtern) {
|
} else if (isExtern) {
|
||||||
symbol_iterator SI = O->symbol_begin();
|
symbol_iterator SI = O->symbol_begin();
|
||||||
|
@ -8,4 +8,4 @@
|
|||||||
|
|
||||||
#define CLANG_VENDOR "FreeBSD "
|
#define CLANG_VENDOR "FreeBSD "
|
||||||
|
|
||||||
#define SVN_REVISION "310316"
|
#define SVN_REVISION "311219"
|
||||||
|
@ -4,5 +4,5 @@
|
|||||||
#define LLD_VERSION_STRING "5.0.0"
|
#define LLD_VERSION_STRING "5.0.0"
|
||||||
#define LLD_VERSION_MAJOR 5
|
#define LLD_VERSION_MAJOR 5
|
||||||
#define LLD_VERSION_MINOR 0
|
#define LLD_VERSION_MINOR 0
|
||||||
#define LLD_REVISION_STRING "310316"
|
#define LLD_REVISION_STRING "311219"
|
||||||
#define LLD_REPOSITORY_STRING "FreeBSD"
|
#define LLD_REPOSITORY_STRING "FreeBSD"
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
/* $FreeBSD$ */
|
/* $FreeBSD$ */
|
||||||
#define LLVM_REVISION "svn-r310316"
|
#define LLVM_REVISION "svn-r311219"
|
||||||
|
Loading…
Reference in New Issue
Block a user