forked from OSchip/llvm-project
[CodeGen] Pull MMI helpers from FunctionLoweringInfo to MMI. NFC.
They're not SelectionDAG- or FunctionLoweringInfo-specific. They are, however, specific to building MMI from IR. We could make them members, but it's nice having MMI be a "simple" data structure and this logic kept separate. This also lets us reuse them from GlobalISel. llvm-svn: 287167
This commit is contained in:
parent
2b4c127531
commit
456dce8a84
|
@ -33,7 +33,6 @@ namespace llvm {
|
|||
class AllocaInst;
|
||||
class BasicBlock;
|
||||
class BranchProbabilityInfo;
|
||||
class CallInst;
|
||||
class Function;
|
||||
class GlobalVariable;
|
||||
class Instruction;
|
||||
|
@ -297,18 +296,6 @@ private:
|
|||
IndexedMap<LiveOutInfo, VirtReg2IndexFunctor> LiveOutRegInfo;
|
||||
};
|
||||
|
||||
/// ComputeUsesVAFloatArgument - Determine if any floating-point values are
|
||||
/// being passed to this variadic function, and set the MachineModuleInfo's
|
||||
/// usesVAFloatArgument flag if so. This flag is used to emit an undefined
|
||||
/// reference to _fltused on Windows, which will link in MSVCRT's
|
||||
/// floating-point support.
|
||||
void ComputeUsesVAFloatArgument(const CallInst &I, MachineModuleInfo *MMI);
|
||||
|
||||
/// AddLandingPadInfo - Extract the exception handling information from the
|
||||
/// landingpad instruction and add them to the specified machine module info.
|
||||
void AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
|
||||
MachineBasicBlock *MBB);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
|
|
@ -49,8 +49,10 @@ namespace llvm {
|
|||
//===----------------------------------------------------------------------===//
|
||||
// Forward declarations.
|
||||
class BlockAddress;
|
||||
class CallInst;
|
||||
class Constant;
|
||||
class GlobalVariable;
|
||||
class LandingPadInst;
|
||||
class MDNode;
|
||||
class MMIAddrLabelMap;
|
||||
class MachineBasicBlock;
|
||||
|
@ -421,6 +423,20 @@ public:
|
|||
|
||||
}; // End class MachineModuleInfo
|
||||
|
||||
//===- MMI building helpers -----------------------------------------------===//
|
||||
|
||||
/// Determine if any floating-point values are being passed to this variadic
|
||||
/// function, and set the MachineModuleInfo's usesVAFloatArgument flag if so.
|
||||
/// This flag is used to emit an undefined reference to _fltused on Windows,
|
||||
/// which will link in MSVCRT's floating-point support.
|
||||
void ComputeUsesVAFloatArgument(const CallInst &I, MachineModuleInfo *MMI);
|
||||
|
||||
/// Extract the exception handling information from the landingpad instruction
|
||||
/// and add them to the specified machine module info.
|
||||
void AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
|
||||
MachineBasicBlock *MBB);
|
||||
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
#include "llvm/ADT/PostOrderIterator.h"
|
||||
#include "llvm/ADT/TinyPtrVector.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
|
@ -19,6 +20,7 @@
|
|||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
|
@ -485,3 +487,52 @@ FunctionPass *createFreeMachineFunctionPass() {
|
|||
return new FreeMachineFunction();
|
||||
}
|
||||
} // end namespace llvm
|
||||
|
||||
//===- MMI building helpers -----------------------------------------------===//
|
||||
|
||||
void llvm::ComputeUsesVAFloatArgument(const CallInst &I,
|
||||
MachineModuleInfo *MMI) {
|
||||
FunctionType *FT =
|
||||
cast<FunctionType>(I.getCalledValue()->getType()->getContainedType(0));
|
||||
if (FT->isVarArg() && !MMI->usesVAFloatArgument()) {
|
||||
for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) {
|
||||
Type *T = I.getArgOperand(i)->getType();
|
||||
for (auto i : post_order(T)) {
|
||||
if (i->isFloatingPointTy()) {
|
||||
MMI->setUsesVAFloatArgument(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void llvm::AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
|
||||
MachineBasicBlock *MBB) {
|
||||
if (const auto *PF = dyn_cast<Function>(
|
||||
I.getParent()->getParent()->getPersonalityFn()->stripPointerCasts()))
|
||||
MMI.addPersonality(PF);
|
||||
|
||||
if (I.isCleanup())
|
||||
MMI.addCleanup(MBB);
|
||||
|
||||
// FIXME: New EH - Add the clauses in reverse order. This isn't 100% correct,
|
||||
// but we need to do it this way because of how the DWARF EH emitter
|
||||
// processes the clauses.
|
||||
for (unsigned i = I.getNumClauses(); i != 0; --i) {
|
||||
Value *Val = I.getClause(i - 1);
|
||||
if (I.isCatch(i - 1)) {
|
||||
MMI.addCatchTypeInfo(MBB,
|
||||
dyn_cast<GlobalValue>(Val->stripPointerCasts()));
|
||||
} else {
|
||||
// Add filters in a list.
|
||||
Constant *CVal = cast<Constant>(Val);
|
||||
SmallVector<const GlobalValue *, 4> FilterList;
|
||||
for (User::op_iterator II = CVal->op_begin(), IE = CVal->op_end();
|
||||
II != IE; ++II)
|
||||
FilterList.push_back(cast<GlobalValue>((*II)->stripPointerCasts()));
|
||||
|
||||
MMI.addFilterTypeInfo(MBB, FilterList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/ADT/PostOrderIterator.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
|
@ -544,61 +543,6 @@ unsigned FunctionLoweringInfo::getCatchPadExceptionPointerVReg(
|
|||
return VReg;
|
||||
}
|
||||
|
||||
/// ComputeUsesVAFloatArgument - Determine if any floating-point values are
|
||||
/// being passed to this variadic function, and set the MachineModuleInfo's
|
||||
/// usesVAFloatArgument flag if so. This flag is used to emit an undefined
|
||||
/// reference to _fltused on Windows, which will link in MSVCRT's
|
||||
/// floating-point support.
|
||||
void llvm::ComputeUsesVAFloatArgument(const CallInst &I,
|
||||
MachineModuleInfo *MMI)
|
||||
{
|
||||
FunctionType *FT = cast<FunctionType>(
|
||||
I.getCalledValue()->getType()->getContainedType(0));
|
||||
if (FT->isVarArg() && !MMI->usesVAFloatArgument()) {
|
||||
for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) {
|
||||
Type* T = I.getArgOperand(i)->getType();
|
||||
for (auto i : post_order(T)) {
|
||||
if (i->isFloatingPointTy()) {
|
||||
MMI->setUsesVAFloatArgument(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// AddLandingPadInfo - Extract the exception handling information from the
|
||||
/// landingpad instruction and add them to the specified machine module info.
|
||||
void llvm::AddLandingPadInfo(const LandingPadInst &I, MachineModuleInfo &MMI,
|
||||
MachineBasicBlock *MBB) {
|
||||
if (const auto *PF = dyn_cast<Function>(
|
||||
I.getParent()->getParent()->getPersonalityFn()->stripPointerCasts()))
|
||||
MMI.addPersonality(PF);
|
||||
|
||||
if (I.isCleanup())
|
||||
MMI.addCleanup(MBB);
|
||||
|
||||
// FIXME: New EH - Add the clauses in reverse order. This isn't 100% correct,
|
||||
// but we need to do it this way because of how the DWARF EH emitter
|
||||
// processes the clauses.
|
||||
for (unsigned i = I.getNumClauses(); i != 0; --i) {
|
||||
Value *Val = I.getClause(i - 1);
|
||||
if (I.isCatch(i - 1)) {
|
||||
MMI.addCatchTypeInfo(MBB,
|
||||
dyn_cast<GlobalValue>(Val->stripPointerCasts()));
|
||||
} else {
|
||||
// Add filters in a list.
|
||||
Constant *CVal = cast<Constant>(Val);
|
||||
SmallVector<const GlobalValue*, 4> FilterList;
|
||||
for (User::op_iterator
|
||||
II = CVal->op_begin(), IE = CVal->op_end(); II != IE; ++II)
|
||||
FilterList.push_back(cast<GlobalValue>((*II)->stripPointerCasts()));
|
||||
|
||||
MMI.addFilterTypeInfo(MBB, FilterList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned
|
||||
FunctionLoweringInfo::getOrCreateSwiftErrorVReg(const MachineBasicBlock *MBB,
|
||||
const Value *Val) {
|
||||
|
|
Loading…
Reference in New Issue