summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86AsmPrinter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/X86/X86AsmPrinter.cpp')
-rw-r--r--llvm/lib/Target/X86/X86AsmPrinter.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp
index dc15aeadaa6..9673d97b408 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -15,6 +15,7 @@
#include "X86AsmPrinter.h"
#include "InstPrinter/X86ATTInstPrinter.h"
#include "MCTargetDesc/X86BaseInfo.h"
+#include "MCTargetDesc/X86TargetStreamer.h"
#include "X86InstrInfo.h"
#include "X86MachineFunctionInfo.h"
#include "llvm/BinaryFormat/COFF.h"
@@ -51,9 +52,12 @@ bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
SMShadowTracker.startFunction(MF);
CodeEmitter.reset(TM.getTarget().createMCCodeEmitter(
- *MF.getSubtarget().getInstrInfo(), *MF.getSubtarget().getRegisterInfo(),
+ *Subtarget->getInstrInfo(), *Subtarget->getRegisterInfo(),
MF.getContext()));
+ EmitFPOData =
+ Subtarget->isTargetWin32() && MF.getMMI().getModule()->getCodeViewFlag();
+
SetupMachineFunction(MF);
if (Subtarget->isTargetCOFF()) {
@@ -72,10 +76,30 @@ bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
// Emit the XRay table for this function.
emitXRayTable();
+ EmitFPOData = false;
+
// We didn't modify anything.
return false;
}
+void X86AsmPrinter::EmitFunctionBodyStart() {
+ if (EmitFPOData) {
+ X86TargetStreamer *XTS =
+ static_cast<X86TargetStreamer *>(OutStreamer->getTargetStreamer());
+ unsigned ParamsSize =
+ MF->getInfo<X86MachineFunctionInfo>()->getArgumentStackSize();
+ XTS->emitFPOProc(CurrentFnSym, ParamsSize);
+ }
+}
+
+void X86AsmPrinter::EmitFunctionBodyEnd() {
+ if (EmitFPOData) {
+ X86TargetStreamer *XTS =
+ static_cast<X86TargetStreamer *>(OutStreamer->getTargetStreamer());
+ XTS->emitFPOEndProc();
+ }
+}
+
/// printSymbolOperand - Print a raw symbol reference operand. This handles
/// jump tables, constant pools, global address and external symbols, all of
/// which print to a label with various suffixes for relocation types etc.
OpenPOWER on IntegriCloud