mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Whitespace!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116664 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
138abae2a2
commit
e70c526d59
@ -57,7 +57,7 @@ class MachineFunction;
|
||||
class Module;
|
||||
class PointerType;
|
||||
class StructType;
|
||||
|
||||
|
||||
/// MachineModuleInfoImpl - This class can be derived from and used by targets
|
||||
/// to hold private target-specific information for each Module. Objects of
|
||||
/// type are accessed/created with MMI::getInfo and destroyed when the
|
||||
@ -70,8 +70,8 @@ public:
|
||||
protected:
|
||||
static SymbolListTy GetSortedStubs(const DenseMap<MCSymbol*, StubValueTy>&);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// LandingPadInfo - This structure is used to retain landing pad info for
|
||||
@ -90,19 +90,19 @@ struct LandingPadInfo {
|
||||
};
|
||||
|
||||
class MMIAddrLabelMap;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// MachineModuleInfo - This class contains meta information specific to a
|
||||
/// module. Queries can be made by different debugging and exception handling
|
||||
/// module. Queries can be made by different debugging and exception handling
|
||||
/// schemes and reformated for specific use.
|
||||
///
|
||||
class MachineModuleInfo : public ImmutablePass {
|
||||
/// Context - This is the MCContext used for the entire code generator.
|
||||
MCContext Context;
|
||||
|
||||
|
||||
/// TheModule - This is the LLVM Module being worked on.
|
||||
const Module *TheModule;
|
||||
|
||||
|
||||
/// ObjFileMMI - This is the object-file-format-specific implementation of
|
||||
/// MachineModuleInfoImpl, which lets targets accumulate whatever info they
|
||||
/// want.
|
||||
@ -111,7 +111,7 @@ class MachineModuleInfo : public ImmutablePass {
|
||||
// FrameMoves - List of moves done by a function's prolog. Used to construct
|
||||
// frame maps by debug and exception handling consumers.
|
||||
std::vector<MachineMove> FrameMoves;
|
||||
|
||||
|
||||
// LandingPads - List of LandingPadInfo describing the landing pad information
|
||||
// in the current function.
|
||||
std::vector<LandingPadInfo> LandingPads;
|
||||
@ -145,14 +145,14 @@ class MachineModuleInfo : public ImmutablePass {
|
||||
/// llvm.compiler.used.
|
||||
SmallPtrSet<const Function *, 32> UsedFunctions;
|
||||
|
||||
|
||||
|
||||
/// AddrLabelSymbols - This map keeps track of which symbol is being used for
|
||||
/// the specified basic block's address of label.
|
||||
MMIAddrLabelMap *AddrLabelSymbols;
|
||||
|
||||
|
||||
bool CallsEHReturn;
|
||||
bool CallsUnwindInit;
|
||||
|
||||
|
||||
/// DbgInfoAvailable - True if debugging information is available
|
||||
/// in this module.
|
||||
bool DbgInfoAvailable;
|
||||
@ -168,20 +168,20 @@ public:
|
||||
MachineModuleInfo(); // DUMMY CONSTRUCTOR, DO NOT CALL.
|
||||
MachineModuleInfo(const MCAsmInfo &MAI); // Real constructor.
|
||||
~MachineModuleInfo();
|
||||
|
||||
|
||||
bool doInitialization();
|
||||
bool doFinalization();
|
||||
|
||||
/// EndFunction - Discard function meta information.
|
||||
///
|
||||
void EndFunction();
|
||||
|
||||
|
||||
const MCContext &getContext() const { return Context; }
|
||||
MCContext &getContext() { return Context; }
|
||||
|
||||
void setModule(const Module *M) { TheModule = M; }
|
||||
const Module *getModule() const { return TheModule; }
|
||||
|
||||
|
||||
/// getInfo - Keep track of various per-function pieces of information for
|
||||
/// backends that would like to do so.
|
||||
///
|
||||
@ -191,16 +191,16 @@ public:
|
||||
ObjFileMMI = new Ty(*this);
|
||||
return *static_cast<Ty*>(ObjFileMMI);
|
||||
}
|
||||
|
||||
|
||||
template<typename Ty>
|
||||
const Ty &getObjFileInfo() const {
|
||||
return const_cast<MachineModuleInfo*>(this)->getObjFileInfo<Ty>();
|
||||
}
|
||||
|
||||
|
||||
/// AnalyzeModule - Scan the module for global debug information.
|
||||
///
|
||||
void AnalyzeModule(const Module &M);
|
||||
|
||||
|
||||
/// hasDebugInfo - Returns true if valid debug info is present.
|
||||
///
|
||||
bool hasDebugInfo() const { return DbgInfoAvailable; }
|
||||
@ -216,7 +216,7 @@ public:
|
||||
/// function's prologue. Used to construct frame maps for debug and exception
|
||||
/// handling comsumers.
|
||||
std::vector<MachineMove> &getFrameMoves() { return FrameMoves; }
|
||||
|
||||
|
||||
/// getAddrLabelSymbol - Return the symbol to be used for the specified basic
|
||||
/// block when its address is taken. This cannot be its normal LBB label
|
||||
/// because the block may be accessed outside its containing function.
|
||||
@ -226,15 +226,15 @@ public:
|
||||
/// basic block when its address is taken. If other blocks were RAUW'd to
|
||||
/// this one, we may have to emit them as well, return the whole set.
|
||||
std::vector<MCSymbol*> getAddrLabelSymbolToEmit(const BasicBlock *BB);
|
||||
|
||||
|
||||
/// takeDeletedSymbolsForFunction - If the specified function has had any
|
||||
/// references to address-taken blocks generated, but the block got deleted,
|
||||
/// return the symbol now so we can emit it. This prevents emitting a
|
||||
/// reference to a symbol that has no definition.
|
||||
void takeDeletedSymbolsForFunction(const Function *F,
|
||||
void takeDeletedSymbolsForFunction(const Function *F,
|
||||
std::vector<MCSymbol*> &Result);
|
||||
|
||||
|
||||
|
||||
//===- EH ---------------------------------------------------------------===//
|
||||
|
||||
/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the
|
||||
@ -245,11 +245,11 @@ public:
|
||||
/// associate it with a try landing pad block.
|
||||
void addInvoke(MachineBasicBlock *LandingPad,
|
||||
MCSymbol *BeginLabel, MCSymbol *EndLabel);
|
||||
|
||||
/// addLandingPad - Add a new panding pad. Returns the label ID for the
|
||||
|
||||
/// addLandingPad - Add a new panding pad. Returns the label ID for the
|
||||
/// landing pad entry.
|
||||
MCSymbol *addLandingPad(MachineBasicBlock *LandingPad);
|
||||
|
||||
|
||||
/// addPersonality - Provide the personality function for the exception
|
||||
/// information.
|
||||
void addPersonality(MachineBasicBlock *LandingPad,
|
||||
@ -285,7 +285,7 @@ public:
|
||||
///
|
||||
void addCleanup(MachineBasicBlock *LandingPad);
|
||||
|
||||
/// getTypeIDFor - Return the type id for the specified typeinfo. This is
|
||||
/// getTypeIDFor - Return the type id for the specified typeinfo. This is
|
||||
/// function wide.
|
||||
unsigned getTypeIDFor(const GlobalVariable *TI);
|
||||
|
||||
@ -296,7 +296,7 @@ public:
|
||||
/// TidyLandingPads - Remap landing pad labels and remove any deleted landing
|
||||
/// pads.
|
||||
void TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap = 0);
|
||||
|
||||
|
||||
/// getLandingPads - Return a reference to the landing pad info for the
|
||||
/// current function.
|
||||
const std::vector<LandingPadInfo> &getLandingPads() const {
|
||||
|
@ -98,7 +98,7 @@ protected: // Can only create subclasses.
|
||||
|
||||
/// TheTarget - The Target that this machine was created for.
|
||||
const Target &TheTarget;
|
||||
|
||||
|
||||
/// AsmInfo - Contains target specific asm information.
|
||||
///
|
||||
const MCAsmInfo *AsmInfo;
|
||||
@ -121,11 +121,11 @@ public:
|
||||
virtual const TargetLowering *getTargetLowering() const { return 0; }
|
||||
virtual const TargetSelectionDAGInfo *getSelectionDAGInfo() const{ return 0; }
|
||||
virtual const TargetData *getTargetData() const { return 0; }
|
||||
|
||||
|
||||
/// getMCAsmInfo - Return target specific asm information.
|
||||
///
|
||||
const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; }
|
||||
|
||||
|
||||
/// getSubtarget - This method returns a pointer to the specified type of
|
||||
/// TargetSubtarget. In debug builds, it verifies that the object being
|
||||
/// returned is of the correct type.
|
||||
@ -138,7 +138,7 @@ public:
|
||||
/// details of graph coloring register allocation removed from it.
|
||||
///
|
||||
virtual const TargetRegisterInfo *getRegisterInfo() const { return 0; }
|
||||
|
||||
|
||||
/// getIntrinsicInfo - If intrinsic information is available, return it. If
|
||||
/// not, return null.
|
||||
///
|
||||
@ -148,17 +148,17 @@ public:
|
||||
/// otherwise return null.
|
||||
///
|
||||
virtual TargetJITInfo *getJITInfo() { return 0; }
|
||||
|
||||
|
||||
/// getInstrItineraryData - Returns instruction itinerary data for the target
|
||||
/// or specific subtarget.
|
||||
///
|
||||
virtual const InstrItineraryData *getInstrItineraryData() const {
|
||||
virtual const InstrItineraryData *getInstrItineraryData() const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// getELFWriterInfo - If this target supports an ELF writer, return
|
||||
/// information for it, otherwise return null.
|
||||
///
|
||||
///
|
||||
virtual const TargetELFWriterInfo *getELFWriterInfo() const { return 0; }
|
||||
|
||||
/// hasMCRelaxAll - Check whether all machine code instructions should be
|
||||
@ -267,7 +267,7 @@ class LLVMTargetMachine : public TargetMachine {
|
||||
|
||||
protected: // Can only create subclasses.
|
||||
LLVMTargetMachine(const Target &T, const std::string &TargetTriple);
|
||||
|
||||
|
||||
private:
|
||||
/// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
|
||||
/// both emitting to assembly files or machine code output.
|
||||
@ -277,11 +277,11 @@ private:
|
||||
|
||||
virtual void setCodeModelForJIT();
|
||||
virtual void setCodeModelForStatic();
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
||||
const std::string &getTargetTriple() const { return TargetTriple; }
|
||||
|
||||
|
||||
/// addPassesToEmitFile - Add passes to the specified pass manager to get the
|
||||
/// specified file emitted. Typically this will involve several steps of code
|
||||
/// generation. If OptLevel is None, the code generator should emit code as
|
||||
@ -291,7 +291,7 @@ public:
|
||||
CodeGenFileType FileType,
|
||||
CodeGenOpt::Level,
|
||||
bool DisableVerify = true);
|
||||
|
||||
|
||||
/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
|
||||
/// get machine code emitted. This uses a JITCodeEmitter object to handle
|
||||
/// actually outputting the machine code and resolving things like the address
|
||||
@ -312,7 +312,7 @@ public:
|
||||
MCContext *&Ctx,
|
||||
CodeGenOpt::Level OptLevel,
|
||||
bool DisableVerify = true);
|
||||
|
||||
|
||||
/// Target-Independent Code Generator Pass Configuration Options.
|
||||
|
||||
/// addPreISelPasses - This method should add any "last minute" LLVM->LLVM
|
||||
@ -349,15 +349,15 @@ public:
|
||||
virtual bool addPreSched2(PassManagerBase &, CodeGenOpt::Level) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// addPreEmitPass - This pass may be implemented by targets that want to run
|
||||
/// passes immediately before machine code is emitted. This should return
|
||||
/// true if -print-machineinstrs should print out the code after the passes.
|
||||
virtual bool addPreEmitPass(PassManagerBase &, CodeGenOpt::Level) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// addCodeEmitter - This pass should be overridden by the target to add a
|
||||
/// code emitter, if supported. If this is not supported, 'true' should be
|
||||
/// returned.
|
||||
|
@ -41,30 +41,30 @@ class MMIAddrLabelMapCallbackPtr : CallbackVH {
|
||||
public:
|
||||
MMIAddrLabelMapCallbackPtr() : Map(0) {}
|
||||
MMIAddrLabelMapCallbackPtr(Value *V) : CallbackVH(V), Map(0) {}
|
||||
|
||||
|
||||
void setPtr(BasicBlock *BB) {
|
||||
ValueHandleBase::operator=(BB);
|
||||
}
|
||||
|
||||
|
||||
void setMap(MMIAddrLabelMap *map) { Map = map; }
|
||||
|
||||
|
||||
virtual void deleted();
|
||||
virtual void allUsesReplacedWith(Value *V2);
|
||||
};
|
||||
|
||||
|
||||
class MMIAddrLabelMap {
|
||||
MCContext &Context;
|
||||
struct AddrLabelSymEntry {
|
||||
/// Symbols - The symbols for the label. This is a pointer union that is
|
||||
/// either one symbol (the common case) or a list of symbols.
|
||||
PointerUnion<MCSymbol *, std::vector<MCSymbol*>*> Symbols;
|
||||
|
||||
|
||||
Function *Fn; // The containing function of the BasicBlock.
|
||||
unsigned Index; // The index in BBCallbacks for the BasicBlock.
|
||||
};
|
||||
|
||||
|
||||
DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols;
|
||||
|
||||
|
||||
/// BBCallbacks - Callbacks for the BasicBlock's that we have entries for. We
|
||||
/// use this so we get notified if a block is deleted or RAUWd.
|
||||
std::vector<MMIAddrLabelMapCallbackPtr> BBCallbacks;
|
||||
@ -76,23 +76,23 @@ class MMIAddrLabelMap {
|
||||
DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> >
|
||||
DeletedAddrLabelsNeedingEmission;
|
||||
public:
|
||||
|
||||
|
||||
MMIAddrLabelMap(MCContext &context) : Context(context) {}
|
||||
~MMIAddrLabelMap() {
|
||||
assert(DeletedAddrLabelsNeedingEmission.empty() &&
|
||||
"Some labels for deleted blocks never got emitted");
|
||||
|
||||
|
||||
// Deallocate any of the 'list of symbols' case.
|
||||
for (DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry>::iterator
|
||||
I = AddrLabelSymbols.begin(), E = AddrLabelSymbols.end(); I != E; ++I)
|
||||
if (I->second.Symbols.is<std::vector<MCSymbol*>*>())
|
||||
delete I->second.Symbols.get<std::vector<MCSymbol*>*>();
|
||||
}
|
||||
|
||||
|
||||
MCSymbol *getAddrLabelSymbol(BasicBlock *BB);
|
||||
std::vector<MCSymbol*> getAddrLabelSymbolToEmit(BasicBlock *BB);
|
||||
|
||||
void takeDeletedSymbolsForFunction(Function *F,
|
||||
void takeDeletedSymbolsForFunction(Function *F,
|
||||
std::vector<MCSymbol*> &Result);
|
||||
|
||||
void UpdateForDeletedBlock(BasicBlock *BB);
|
||||
@ -104,7 +104,7 @@ MCSymbol *MMIAddrLabelMap::getAddrLabelSymbol(BasicBlock *BB) {
|
||||
assert(BB->hasAddressTaken() &&
|
||||
"Shouldn't get label for block without address taken");
|
||||
AddrLabelSymEntry &Entry = AddrLabelSymbols[BB];
|
||||
|
||||
|
||||
// If we already had an entry for this block, just return it.
|
||||
if (!Entry.Symbols.isNull()) {
|
||||
assert(BB->getParent() == Entry.Fn && "Parent changed");
|
||||
@ -112,7 +112,7 @@ MCSymbol *MMIAddrLabelMap::getAddrLabelSymbol(BasicBlock *BB) {
|
||||
return Entry.Symbols.get<MCSymbol*>();
|
||||
return (*Entry.Symbols.get<std::vector<MCSymbol*>*>())[0];
|
||||
}
|
||||
|
||||
|
||||
// Otherwise, this is a new entry, create a new symbol for it and add an
|
||||
// entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd.
|
||||
BBCallbacks.push_back(BB);
|
||||
@ -129,9 +129,9 @@ MMIAddrLabelMap::getAddrLabelSymbolToEmit(BasicBlock *BB) {
|
||||
assert(BB->hasAddressTaken() &&
|
||||
"Shouldn't get label for block without address taken");
|
||||
AddrLabelSymEntry &Entry = AddrLabelSymbols[BB];
|
||||
|
||||
|
||||
std::vector<MCSymbol*> Result;
|
||||
|
||||
|
||||
// If we already had an entry for this block, just return it.
|
||||
if (Entry.Symbols.isNull())
|
||||
Result.push_back(getAddrLabelSymbol(BB));
|
||||
@ -152,7 +152,7 @@ takeDeletedSymbolsForFunction(Function *F, std::vector<MCSymbol*> &Result) {
|
||||
|
||||
// If there are no entries for the function, just return.
|
||||
if (I == DeletedAddrLabelsNeedingEmission.end()) return;
|
||||
|
||||
|
||||
// Otherwise, take the list.
|
||||
std::swap(Result, I->second);
|
||||
DeletedAddrLabelsNeedingEmission.erase(I);
|
||||
@ -175,7 +175,7 @@ void MMIAddrLabelMap::UpdateForDeletedBlock(BasicBlock *BB) {
|
||||
if (MCSymbol *Sym = Entry.Symbols.dyn_cast<MCSymbol*>()) {
|
||||
if (Sym->isDefined())
|
||||
return;
|
||||
|
||||
|
||||
// If the block is not yet defined, we need to emit it at the end of the
|
||||
// function. Add the symbol to the DeletedAddrLabelsNeedingEmission list
|
||||
// for the containing Function. Since the block is being deleted, its
|
||||
@ -187,7 +187,7 @@ void MMIAddrLabelMap::UpdateForDeletedBlock(BasicBlock *BB) {
|
||||
for (unsigned i = 0, e = Syms->size(); i != e; ++i) {
|
||||
MCSymbol *Sym = (*Syms)[i];
|
||||
if (Sym->isDefined()) continue; // Ignore already emitted labels.
|
||||
|
||||
|
||||
// If the block is not yet defined, we need to emit it at the end of the
|
||||
// function. Add the symbol to the DeletedAddrLabelsNeedingEmission list
|
||||
// for the containing Function. Since the block is being deleted, its
|
||||
@ -195,7 +195,7 @@ void MMIAddrLabelMap::UpdateForDeletedBlock(BasicBlock *BB) {
|
||||
// 'Entry'.
|
||||
DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym);
|
||||
}
|
||||
|
||||
|
||||
// The entry is deleted, free the memory associated with the symbol list.
|
||||
delete Syms;
|
||||
}
|
||||
@ -225,7 +225,7 @@ void MMIAddrLabelMap::UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New) {
|
||||
SymList->push_back(PrevSym);
|
||||
NewEntry.Symbols = SymList;
|
||||
}
|
||||
|
||||
|
||||
std::vector<MCSymbol*> *SymList =
|
||||
NewEntry.Symbols.get<std::vector<MCSymbol*>*>();
|
||||
|
||||
@ -234,7 +234,7 @@ void MMIAddrLabelMap::UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New) {
|
||||
SymList->push_back(Sym);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Otherwise, concatenate the list.
|
||||
std::vector<MCSymbol*> *Syms =OldEntry.Symbols.get<std::vector<MCSymbol*>*>();
|
||||
SymList->insert(SymList->end(), Syms->begin(), Syms->end());
|
||||
@ -272,7 +272,7 @@ MachineModuleInfo::MachineModuleInfo()
|
||||
|
||||
MachineModuleInfo::~MachineModuleInfo() {
|
||||
delete ObjFileMMI;
|
||||
|
||||
|
||||
// FIXME: Why isn't doFinalization being called??
|
||||
//assert(AddrLabelSymbols == 0 && "doFinalization not called");
|
||||
delete AddrLabelSymbols;
|
||||
@ -472,7 +472,7 @@ void MachineModuleInfo::TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap) {
|
||||
(LPMap && (*LPMap)[BeginLabel] != 0)) &&
|
||||
(EndLabel->isDefined() ||
|
||||
(LPMap && (*LPMap)[EndLabel] != 0))) continue;
|
||||
|
||||
|
||||
LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j);
|
||||
LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j);
|
||||
--j, --e;
|
||||
|
@ -73,7 +73,7 @@ LimitFPPrecision("limit-float-precision",
|
||||
static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
const SDValue *Parts, unsigned NumParts,
|
||||
EVT PartVT, EVT ValueVT);
|
||||
|
||||
|
||||
/// getCopyFromParts - Create a value that contains the specified legal parts
|
||||
/// combined into the value they represent. If the parts combine to a type
|
||||
/// larger then ValueVT then AssertOp can be used to specify whether the extra
|
||||
@ -85,7 +85,7 @@ static SDValue getCopyFromParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
ISD::NodeType AssertOp = ISD::DELETED_NODE) {
|
||||
if (ValueVT.isVector())
|
||||
return getCopyFromPartsVector(DAG, DL, Parts, NumParts, PartVT, ValueVT);
|
||||
|
||||
|
||||
assert(NumParts > 0 && "No parts to assemble!");
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue Val = Parts[0];
|
||||
@ -206,7 +206,7 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
assert(NumParts > 0 && "No parts to assemble!");
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
SDValue Val = Parts[0];
|
||||
|
||||
|
||||
// Handle a multi-element vector.
|
||||
if (NumParts > 1) {
|
||||
EVT IntermediateVT, RegisterVT;
|
||||
@ -219,7 +219,7 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
|
||||
assert(RegisterVT == Parts[0].getValueType() &&
|
||||
"Part type doesn't match part!");
|
||||
|
||||
|
||||
// Assemble the parts into intermediate operands.
|
||||
SmallVector<SDValue, 8> Ops(NumIntermediates);
|
||||
if (NumIntermediates == NumParts) {
|
||||
@ -238,20 +238,20 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
Ops[i] = getCopyFromParts(DAG, DL, &Parts[i * Factor], Factor,
|
||||
PartVT, IntermediateVT);
|
||||
}
|
||||
|
||||
|
||||
// Build a vector with BUILD_VECTOR or CONCAT_VECTORS from the
|
||||
// intermediate operands.
|
||||
Val = DAG.getNode(IntermediateVT.isVector() ?
|
||||
ISD::CONCAT_VECTORS : ISD::BUILD_VECTOR, DL,
|
||||
ValueVT, &Ops[0], NumIntermediates);
|
||||
}
|
||||
|
||||
|
||||
// There is now one part, held in Val. Correct it to match ValueVT.
|
||||
PartVT = Val.getValueType();
|
||||
|
||||
|
||||
if (PartVT == ValueVT)
|
||||
return Val;
|
||||
|
||||
|
||||
if (PartVT.isVector()) {
|
||||
// If the element type of the source/dest vectors are the same, but the
|
||||
// parts vector has more elements than the value vector, then we have a
|
||||
@ -262,12 +262,12 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
"Cannot narrow, it would be a lossy transformation");
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ValueVT, Val,
|
||||
DAG.getIntPtrConstant(0));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Vector/Vector bitcast.
|
||||
return DAG.getNode(ISD::BIT_CONVERT, DL, ValueVT, Val);
|
||||
}
|
||||
|
||||
|
||||
assert(ValueVT.getVectorElementType() == PartVT &&
|
||||
ValueVT.getVectorNumElements() == 1 &&
|
||||
"Only trivial scalar-to-vector conversions should get here!");
|
||||
@ -280,7 +280,7 @@ static SDValue getCopyFromPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc dl,
|
||||
SDValue Val, SDValue *Parts, unsigned NumParts,
|
||||
EVT PartVT);
|
||||
|
||||
|
||||
/// getCopyToParts - Create a series of nodes that contain the specified value
|
||||
/// split into legal parts. If the parts contain more bits than Val, then, for
|
||||
/// integers, ExtendKind can be used to specify how to generate the extra bits.
|
||||
@ -289,11 +289,11 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
EVT PartVT,
|
||||
ISD::NodeType ExtendKind = ISD::ANY_EXTEND) {
|
||||
EVT ValueVT = Val.getValueType();
|
||||
|
||||
|
||||
// Handle the vector case separately.
|
||||
if (ValueVT.isVector())
|
||||
return getCopyToPartsVector(DAG, DL, Val, Parts, NumParts, PartVT);
|
||||
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
unsigned PartBits = PartVT.getSizeInBits();
|
||||
unsigned OrigNumParts = NumParts;
|
||||
@ -316,7 +316,7 @@ static void getCopyToParts(SelectionDAG &DAG, DebugLoc DL,
|
||||
Val = DAG.getNode(ISD::FP_EXTEND, DL, PartVT, Val);
|
||||
} else {
|
||||
assert(PartVT.isInteger() && ValueVT.isInteger() &&
|
||||
"Unknown mismatch!");
|
||||
"Unknown mismatch!");
|
||||
ValueVT = EVT::getIntegerVT(*DAG.getContext(), NumParts * PartBits);
|
||||
Val = DAG.getNode(ExtendKind, DL, ValueVT, Val);
|
||||
}
|
||||
@ -403,7 +403,7 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
EVT ValueVT = Val.getValueType();
|
||||
assert(ValueVT.isVector() && "Not a vector");
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
|
||||
|
||||
if (NumParts == 1) {
|
||||
if (PartVT == ValueVT) {
|
||||
// Nothing to do.
|
||||
@ -420,7 +420,7 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
for (unsigned i = 0, e = ValueVT.getVectorNumElements(); i != e; ++i)
|
||||
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
|
||||
ElementVT, Val, DAG.getIntPtrConstant(i)));
|
||||
|
||||
|
||||
for (unsigned i = ValueVT.getVectorNumElements(),
|
||||
e = PartVT.getVectorNumElements(); i != e; ++i)
|
||||
Ops.push_back(DAG.getUNDEF(ElementVT));
|
||||
@ -428,7 +428,7 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
Val = DAG.getNode(ISD::BUILD_VECTOR, DL, PartVT, &Ops[0], Ops.size());
|
||||
|
||||
// FIXME: Use CONCAT for 2x -> 4x.
|
||||
|
||||
|
||||
//SDValue UndefElts = DAG.getUNDEF(VectorTy);
|
||||
//Val = DAG.getNode(ISD::CONCAT_VECTORS, DL, PartVT, Val, UndefElts);
|
||||
} else {
|
||||
@ -439,11 +439,11 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
|
||||
PartVT, Val, DAG.getIntPtrConstant(0));
|
||||
}
|
||||
|
||||
|
||||
Parts[0] = Val;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Handle a multi-element vector.
|
||||
EVT IntermediateVT, RegisterVT;
|
||||
unsigned NumIntermediates;
|
||||
@ -451,11 +451,11 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
IntermediateVT,
|
||||
NumIntermediates, RegisterVT);
|
||||
unsigned NumElements = ValueVT.getVectorNumElements();
|
||||
|
||||
|
||||
assert(NumRegs == NumParts && "Part count doesn't match vector breakdown!");
|
||||
NumParts = NumRegs; // Silence a compiler warning.
|
||||
assert(RegisterVT == PartVT && "Part type doesn't match vector breakdown!");
|
||||
|
||||
|
||||
// Split the vector into intermediate operands.
|
||||
SmallVector<SDValue, 8> Ops(NumIntermediates);
|
||||
for (unsigned i = 0; i != NumIntermediates; ++i) {
|
||||
@ -467,7 +467,7 @@ static void getCopyToPartsVector(SelectionDAG &DAG, DebugLoc DL,
|
||||
Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
|
||||
IntermediateVT, Val, DAG.getIntPtrConstant(i));
|
||||
}
|
||||
|
||||
|
||||
// Split the intermediate operands into legal parts.
|
||||
if (NumParts == NumIntermediates) {
|
||||
// If the register was not expanded, promote or copy the value,
|
||||
@ -1348,7 +1348,7 @@ SelectionDAGBuilder::ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases){
|
||||
if (Cases[0].CC == ISD::SETNE && Cases[0].FalseBB == Cases[1].ThisBB)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2963,7 +2963,7 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
PtrVT, Ptr,
|
||||
DAG.getConstant(Offsets[i], PtrVT));
|
||||
SDValue L = DAG.getLoad(ValueVTs[i], getCurDebugLoc(), Root,
|
||||
A, MachinePointerInfo(SV, Offsets[i]), isVolatile,
|
||||
A, MachinePointerInfo(SV, Offsets[i]), isVolatile,
|
||||
isNonTemporal, Alignment);
|
||||
|
||||
Values[i] = L;
|
||||
@ -3930,7 +3930,7 @@ static SDValue ExpandPowI(DebugLoc DL, SDValue LHS, SDValue RHS,
|
||||
/// At the end of instruction selection, they will be inserted to the entry BB.
|
||||
bool
|
||||
SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable,
|
||||
int64_t Offset,
|
||||
int64_t Offset,
|
||||
const SDValue &N) {
|
||||
const Argument *Arg = dyn_cast<Argument>(V);
|
||||
if (!Arg)
|
||||
@ -4073,7 +4073,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
Size = C->getZExtValue();
|
||||
if (AA->alias(I.getArgOperand(0), Size, I.getArgOperand(1), Size) ==
|
||||
AliasAnalysis::NoAlias) {
|
||||
DAG.setRoot(DAG.getMemcpy(getRoot(), dl, Op1, Op2, Op3, Align, isVol,
|
||||
DAG.setRoot(DAG.getMemcpy(getRoot(), dl, Op1, Op2, Op3, Align, isVol,
|
||||
false, MachinePointerInfo(I.getArgOperand(0)),
|
||||
MachinePointerInfo(I.getArgOperand(1))));
|
||||
return 0;
|
||||
@ -4100,7 +4100,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
// Check if address has undef value.
|
||||
if (isa<UndefValue>(Address) ||
|
||||
(Address->use_empty() && !isa<Argument>(Address))) {
|
||||
SDDbgValue*SDV =
|
||||
SDDbgValue*SDV =
|
||||
DAG.getDbgValue(Variable, UndefValue::get(Address->getType()),
|
||||
0, dl, SDNodeOrder);
|
||||
DAG.AddDbgValue(SDV, 0, false);
|
||||
@ -4114,7 +4114,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
SDDbgValue *SDV;
|
||||
if (N.getNode()) {
|
||||
// Parameters are handled specially.
|
||||
bool isParameter =
|
||||
bool isParameter =
|
||||
DIVariable(Variable).getTag() == dwarf::DW_TAG_arg_variable;
|
||||
if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
|
||||
Address = BCI->getOperand(0);
|
||||
@ -4139,7 +4139,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
DAG.AddDbgValue(SDV, N.getNode(), isParameter);
|
||||
} else {
|
||||
// If Address is an argument then try to emit its dbg value using
|
||||
// virtual register info from the FuncInfo.ValueMap.
|
||||
// virtual register info from the FuncInfo.ValueMap.
|
||||
if (!EmitFuncArgumentDbgValue(Address, Variable, 0, N)) {
|
||||
// If variable is pinned by a alloca in dominating bb then
|
||||
// use StaticAllocaMap.
|
||||
@ -4222,7 +4222,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
if (SI == FuncInfo.StaticAllocaMap.end())
|
||||
return 0; // VLAs.
|
||||
int FI = SI->second;
|
||||
|
||||
|
||||
MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI();
|
||||
if (!DI.getDebugLoc().isUnknown() && MMI.hasDebugInfo())
|
||||
MMI.setVariableDbgInfo(Variable, FI, DI.getDebugLoc());
|
||||
@ -4810,7 +4810,7 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
|
||||
SDValue Chain = DAG.getNode(ISD::TokenFactor, getCurDebugLoc(),
|
||||
MVT::Other, &Chains[0], NumValues);
|
||||
PendingLoads.push_back(Chain);
|
||||
|
||||
|
||||
// Collect the legal value parts into potentially illegal values
|
||||
// that correspond to the original function's return values.
|
||||
SmallVector<EVT, 4> RetTys;
|
||||
@ -4823,7 +4823,7 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
|
||||
EVT VT = RetTys[I];
|
||||
EVT RegisterVT = TLI.getRegisterType(RetTy->getContext(), VT);
|
||||
unsigned NumRegs = TLI.getNumRegisters(RetTy->getContext(), VT);
|
||||
|
||||
|
||||
SDValue ReturnValue =
|
||||
getCopyFromParts(DAG, getCurDebugLoc(), &Values[CurReg], NumRegs,
|
||||
RegisterVT, VT, AssertOp);
|
||||
@ -5001,7 +5001,7 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
|
||||
visitInlineAsm(&I);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const char *RenameFn = 0;
|
||||
if (Function *F = I.getCalledFunction()) {
|
||||
if (F->isDeclaration()) {
|
||||
@ -5079,7 +5079,7 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SDValue Callee;
|
||||
if (!RenameFn)
|
||||
Callee = getValue(I.getCalledValue());
|
||||
@ -5168,7 +5168,7 @@ public:
|
||||
|
||||
return TLI.getValueType(OpTy, true);
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
/// MarkRegAndAliases - Mark the specified register and all aliases in the
|
||||
/// specified set.
|
||||
@ -5425,13 +5425,13 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
|
||||
std::vector<TargetLowering::AsmOperandInfo> TargetConstraints = TLI.ParseConstraints(CS);
|
||||
bool hasMemory = false;
|
||||
|
||||
|
||||
unsigned ArgNo = 0; // ArgNo - The argument of the CallInst.
|
||||
unsigned ResNo = 0; // ResNo - The result number of the next output.
|
||||
for (unsigned i = 0, e = TargetConstraints.size(); i != e; ++i) {
|
||||
ConstraintOperands.push_back(SDISelAsmOperandInfo(TargetConstraints[i]));
|
||||
SDISelAsmOperandInfo &OpInfo = ConstraintOperands.back();
|
||||
|
||||
|
||||
EVT OpVT = MVT::Other;
|
||||
|
||||
// Compute the value type for each operand.
|
||||
@ -5479,7 +5479,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
}
|
||||
|
||||
OpInfo.ConstraintVT = OpVT;
|
||||
|
||||
|
||||
// Indirect operand accesses access memory.
|
||||
if (OpInfo.isIndirect)
|
||||
hasMemory = true;
|
||||
@ -5514,7 +5514,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
// error.
|
||||
if (OpInfo.hasMatchingInput()) {
|
||||
SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
|
||||
|
||||
|
||||
if (OpInfo.ConstraintVT != Input.ConstraintVT) {
|
||||
if ((OpInfo.ConstraintVT.isInteger() !=
|
||||
Input.ConstraintVT.isInteger()) ||
|
||||
@ -5695,7 +5695,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
" don't know how to handle tied "
|
||||
"indirect register inputs");
|
||||
}
|
||||
|
||||
|
||||
RegsForValue MatchedRegs;
|
||||
MatchedRegs.ValueVTs.push_back(InOperandVal.getValueType());
|
||||
EVT RegVT = AsmNodeOperands[CurOp+1].getValueType();
|
||||
@ -5714,7 +5714,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
DAG, AsmNodeOperands);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
assert(InlineAsm::isMemKind(OpFlag) && "Unknown matching constraint!");
|
||||
assert(InlineAsm::getNumOperandRegisters(OpFlag) == 1 &&
|
||||
"Unexpected number of operands");
|
||||
@ -5729,8 +5729,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
}
|
||||
|
||||
// Treat indirect 'X' constraint as memory.
|
||||
if (OpInfo.ConstraintType == TargetLowering::C_Other &&
|
||||
OpInfo.isIndirect)
|
||||
if (OpInfo.ConstraintType == TargetLowering::C_Other &&
|
||||
OpInfo.isIndirect)
|
||||
OpInfo.ConstraintType = TargetLowering::C_Memory;
|
||||
|
||||
if (OpInfo.ConstraintType == TargetLowering::C_Other) {
|
||||
@ -5749,7 +5749,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
AsmNodeOperands.insert(AsmNodeOperands.end(), Ops.begin(), Ops.end());
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (OpInfo.ConstraintType == TargetLowering::C_Memory) {
|
||||
assert(OpInfo.isIndirect && "Operand must be indirect to be a mem!");
|
||||
assert(InOperandVal.getValueType() == TLI.getPointerTy() &&
|
||||
@ -6261,7 +6261,7 @@ void SelectionDAGISel::LowerArguments(const BasicBlock *LLVMBB) {
|
||||
|
||||
// Note down frame index for byval arguments.
|
||||
if (I->hasByValAttr() && !ArgValues.empty())
|
||||
if (FrameIndexSDNode *FI =
|
||||
if (FrameIndexSDNode *FI =
|
||||
dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
|
||||
FuncInfo->setByValArgumentFrameIndex(I, FI->getIndex());
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user