summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJuergen Ributzka <juergen@apple.com>2014-01-30 18:58:27 +0000
committerJuergen Ributzka <juergen@apple.com>2014-01-30 18:58:27 +0000
commit014fdcdaf0cf194ec6c265647197dee8f589fac4 (patch)
treec57fb0ae3d243405ffbe627de789103768358c91 /lib
parentb68991fd8798f77642dd01d57b8f35de216bd057 (diff)
downloadllvm-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.cpp24
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);