diff options
author | Juergen Ributzka <juergen@apple.com> | 2014-01-30 18:58:27 +0000 |
---|---|---|
committer | Juergen Ributzka <juergen@apple.com> | 2014-01-30 18:58:27 +0000 |
commit | 014fdcdaf0cf194ec6c265647197dee8f589fac4 (patch) | |
tree | c57fb0ae3d243405ffbe627de789103768358c91 /lib | |
parent | b68991fd8798f77642dd01d57b8f35de216bd057 (diff) | |
download | llvm-014fdcdaf0cf194ec6c265647197dee8f589fac4.tar.gz llvm-014fdcdaf0cf194ec6c265647197dee8f589fac4.tar.bz2 llvm-014fdcdaf0cf194ec6c265647197dee8f589fac4.tar.xz |
[Stackmaps] Record the stack size of each function that contains a stackmap/patchpoint intrinsic.
Re-applying the patch, but this time without using AsmPrinter methods.
Reviewed by Andy
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200481 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/StackMaps.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/CodeGen/StackMaps.cpp b/lib/CodeGen/StackMaps.cpp index 79c1e7dce5..1ec2587777 100644 --- a/lib/CodeGen/StackMaps.cpp +++ b/lib/CodeGen/StackMaps.cpp @@ -11,6 +11,8 @@ #include "llvm/CodeGen/StackMaps.h" #include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/IR/DataLayout.h" #include "llvm/MC/MCContext.h" @@ -216,12 +218,19 @@ void StackMaps::recordStackMapOpers(const MachineInstr &MI, uint64_t ID, } } + // Create an expression to calculate the offset of the callsite from function + // entry. const MCExpr *CSOffsetExpr = MCBinaryExpr::CreateSub( MCSymbolRefExpr::Create(MILabel, OutContext), MCSymbolRefExpr::Create(AP.CurrentFnSym, OutContext), OutContext); CSInfos.push_back(CallsiteInfo(CSOffsetExpr, ID, Locations, LiveOuts)); + + // Record the stack size of the current function. + const MachineFrameInfo *MFI = AP.MF->getFrameInfo(); + FnStackSize[AP.CurrentFnSym] = + MFI->hasVarSizedObjects() ? ~0U : MFI->getStackSize(); } void StackMaps::recordStackMap(const MachineInstr &MI) { @@ -258,6 +267,11 @@ void StackMaps::recordPatchPoint(const MachineInstr &MI) { /// serializeToStackMapSection conceptually populates the following fields: /// /// uint32 : Reserved (header) +/// uint32 : NumFunctions +/// StkSizeRecord[NumFunctions] { +/// uint32 : Function Offset +/// uint32 : Stack Size +/// } /// uint32 : NumConstants /// int64 : Constants[NumConstants] /// uint32 : NumRecords @@ -313,6 +327,16 @@ void StackMaps::serializeToStackMapSection() { // Header. AP.OutStreamer.EmitIntValue(0, 4); + // Num functions. + AP.OutStreamer.EmitIntValue(FnStackSize.size(), 4); + + // Stack size entries. + for (FnStackSizeMap::iterator I = FnStackSize.begin(), E = FnStackSize.end(); + I != E; ++I) { + AP.OutStreamer.EmitSymbolValue(I->first, 4); + AP.OutStreamer.EmitIntValue(I->second, 4); + } + // Num constants. AP.OutStreamer.EmitIntValue(ConstPool.getNumConstants(), 4); |