AsmPrinterDwarf.cpp revision 0b8c9a80f20772c3793201ab5b251d3520b9cea3
1ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//===-- AsmPrinterDwarf.cpp - AsmPrinter Dwarf Support --------------------===//
2ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//
3ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//                     The LLVM Compiler Infrastructure
4ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//
5c0187f3b2f62ff914d7869403213bdf4ec0b3aa7Jens Axboe// This file is distributed under the University of Illinois Open Source
6ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron// License. See LICENSE.TXT for details.
7ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//
8ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//===----------------------------------------------------------------------===//
9ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//
10ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron// This file implements the Dwarf emissions parts of AsmPrinter.
11ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//
12ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//===----------------------------------------------------------------------===//
13ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron
14ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#define DEBUG_TYPE "asm-printer"
15ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/CodeGen/AsmPrinter.h"
16ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/ADT/Twine.h"
17ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/IR/DataLayout.h"
18ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/MC/MCAsmInfo.h"
19ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/MC/MCSection.h"
20ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/MC/MCStreamer.h"
21ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/MC/MCSymbol.h"
22ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/MC/MachineLocation.h"
23ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron#include "llvm/Support/Dwarf.h"
248232e2855c87697a95d00d920d1fd11b30d0fcaaStephen M. Cameron#include "llvm/Support/ErrorHandling.h"
2560f6b33079c8ffbd09f448060f58b82ba920b620Stephen M. Cameron#include "llvm/Target/TargetFrameLowering.h"
266b79c80c14766df7b0507c4ec679507a315ad61aJens Axboe#include "llvm/Target/TargetLoweringObjectFile.h"
278232e2855c87697a95d00d920d1fd11b30d0fcaaStephen M. Cameron#include "llvm/Target/TargetMachine.h"
285b7573ab40a30b389602d4b0ec3805957b483a19Stephen M. Cameron#include "llvm/Target/TargetRegisterInfo.h"
292fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboeusing namespace llvm;
30ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron
31ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron//===----------------------------------------------------------------------===//
328232e2855c87697a95d00d920d1fd11b30d0fcaaStephen M. Cameron// Dwarf Emission Helper Routines
332fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe//===----------------------------------------------------------------------===//
348232e2855c87697a95d00d920d1fd11b30d0fcaaStephen M. Cameron
3563a130b7f037b55b56de05921803254a7b9ed9bbJens Axboe/// EmitSLEB128 - emit the specified signed leb128 value.
36f3e8440f75f98ced28cdd19ba785718e734cf7c5Jens Axboevoid AsmPrinter::EmitSLEB128(int Value, const char *Desc) const {
3763a130b7f037b55b56de05921803254a7b9ed9bbJens Axboe  if (isVerbose() && Desc)
383e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe    OutStreamer.AddComment(Desc);
396b79c80c14766df7b0507c4ec679507a315ad61aJens Axboe
403e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  OutStreamer.EmitSLEB128IntValue(Value);
41f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron}
42f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron
43f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron/// EmitULEB128 - emit the specified signed leb128 value.
44f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameronvoid AsmPrinter::EmitULEB128(unsigned Value, const char *Desc,
453e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe                             unsigned PadTo) const {
46f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron  if (isVerbose() && Desc)
47b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe    OutStreamer.AddComment(Desc);
48f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron
49f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron  OutStreamer.EmitULEB128IntValue(Value, 0/*addrspace*/, PadTo);
50f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron}
51f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron
52f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron/// EmitCFAByte - Emit a .byte 42 directive for a DW_CFA_xxx value.
533e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboevoid AsmPrinter::EmitCFAByte(unsigned Val) const {
54f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron  if (isVerbose()) {
553e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe    if (Val >= dwarf::DW_CFA_offset && Val < dwarf::DW_CFA_offset+64)
56b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe      OutStreamer.AddComment("DW_CFA_offset + Reg (" +
57b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe                             Twine(Val-dwarf::DW_CFA_offset) + ")");
583e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe    else
59b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe      OutStreamer.AddComment(dwarf::CallFrameString(Val));
60b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe  }
613e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  OutStreamer.EmitIntValue(Val, 1, 0/*addrspace*/);
62f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron}
63f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron
64843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboestatic const char *DecodeDWARFEncoding(unsigned Encoding) {
65843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboe  switch (Encoding) {
66843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboe  case dwarf::DW_EH_PE_absptr: return "absptr";
67843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboe  case dwarf::DW_EH_PE_omit:   return "omit";
68843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboe  case dwarf::DW_EH_PE_pcrel:  return "pcrel";
69843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboe  case dwarf::DW_EH_PE_udata4: return "udata4";
70843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboe  case dwarf::DW_EH_PE_udata8: return "udata8";
713e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  case dwarf::DW_EH_PE_sdata4: return "sdata4";
72807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe  case dwarf::DW_EH_PE_sdata8: return "sdata8";
73807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe  case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4: return "pcrel udata4";
74807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe  case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4: return "pcrel sdata4";
75807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe  case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8: return "pcrel udata8";
763e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8: return "pcrel sdata8";
773e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata4:
783e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe    return "indirect pcrel udata4";
793e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata4:
803e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe    return "indirect pcrel sdata4";
813e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata8:
823e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe    return "indirect pcrel udata8";
833e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata8:
843e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe    return "indirect pcrel sdata8";
853e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  }
863e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe
873e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe  return "<unknown encoding>";
88ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron}
89ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron
905b7573ab40a30b389602d4b0ec3805957b483a19Stephen M. Cameron
91c36f98d9487c4b3a9b5c1f77aedb15e674b5a192Stephen M. Cameron/// EmitEncodingByte - Emit a .byte 42 directive that corresponds to an
92c36f98d9487c4b3a9b5c1f77aedb15e674b5a192Stephen M. Cameron/// encoding.  If verbose assembly output is enabled, we output comments
93c36f98d9487c4b3a9b5c1f77aedb15e674b5a192Stephen M. Cameron/// describing the encoding.  Desc is an optional string saying what the
9404cc6b77973636a914de3dff8ca6ae0857cf453bStephen M. Cameron/// encoding is specifying (e.g. "LSDA").
95f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameronvoid AsmPrinter::EmitEncodingByte(unsigned Val, const char *Desc) const {
96f3074008948b51ec380b4f06791ceec89a40d8a6Stephen M. Cameron  if (isVerbose()) {
97736f2dff9fa6af83434bc4decafc6d8b40054ca0Stephen M. Cameron    if (Desc != 0)
982fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe      OutStreamer.AddComment(Twine(Desc)+" Encoding = " +
992fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe                             Twine(DecodeDWARFEncoding(Val)));
1002fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe    else
1013ea48b883bcac5ad0c119205805b741af45427e3Stephen M. Cameron      OutStreamer.AddComment(Twine("Encoding = ") +
1023ea48b883bcac5ad0c119205805b741af45427e3Stephen M. Cameron                             DecodeDWARFEncoding(Val));
1030420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe  }
1040420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe
105f9d40b4814d88ca1ca13a05cf45b6f36cfb2ba55Jens Axboe  OutStreamer.EmitIntValue(Val, 1, 0/*addrspace*/);
106f9d40b4814d88ca1ca13a05cf45b6f36cfb2ba55Jens Axboe}
1079b260bdfc79dfc55855ffddce15ac1ca7025376fJens Axboe
1089b260bdfc79dfc55855ffddce15ac1ca7025376fJens Axboe/// GetSizeOfEncodedValue - Return the size of the encoding in bytes.
1094cbe721180807c629dc521e368692025d9cac288Jens Axboeunsigned AsmPrinter::GetSizeOfEncodedValue(unsigned Encoding) const {
110736f2dff9fa6af83434bc4decafc6d8b40054ca0Stephen M. Cameron  if (Encoding == dwarf::DW_EH_PE_omit)
111843ad23782b4e6061dcc0e14b0fbc5f4fecf55f9Jens Axboe    return 0;
1123e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe
1133ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe  switch (Encoding & 0x07) {
11425927259f482b0288d962e36dbfd33ec90a69521Stephen M. Cameron  default: llvm_unreachable("Invalid encoded value.");
11563a130b7f037b55b56de05921803254a7b9ed9bbJens Axboe  case dwarf::DW_EH_PE_absptr: return TM.getDataLayout()->getPointerSize();
1160420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe  case dwarf::DW_EH_PE_udata2: return 2;
1172fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  case dwarf::DW_EH_PE_udata4: return 4;
1182fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  case dwarf::DW_EH_PE_udata8: return 8;
119b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe  }
1200420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe}
1210420ba6a85617cb02e196ac92e519191dafc6c52Jens Axboe
1225b7573ab40a30b389602d4b0ec3805957b483a19Stephen M. Cameronvoid AsmPrinter::EmitTTypeReference(const GlobalValue *GV,
123ff1f3280ded10c6844c07f0e466ca02224e48b62Stephen M. Cameron                                    unsigned Encoding) const {
124e0681f3edfb755e710fe7016e470d947bc5dbc3cJens Axboe  if (GV) {
125e0681f3edfb755e710fe7016e470d947bc5dbc3cJens Axboe    const TargetLoweringObjectFile &TLOF = getObjFileLowering();
126b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe
127e0681f3edfb755e710fe7016e470d947bc5dbc3cJens Axboe    const MCExpr *Exp =
128e0681f3edfb755e710fe7016e470d947bc5dbc3cJens Axboe      TLOF.getTTypeGlobalReference(GV, Mang, MMI, Encoding, OutStreamer);
1296b79c80c14766df7b0507c4ec679507a315ad61aJens Axboe    OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding), /*addrspace*/0);
130dcaeb6060f2c7aef184cca5699e12c264ef0b834Jens Axboe  } else
131dcaeb6060f2c7aef184cca5699e12c264ef0b834Jens Axboe    OutStreamer.EmitIntValue(0, GetSizeOfEncodedValue(Encoding), 0);
132e0681f3edfb755e710fe7016e470d947bc5dbc3cJens Axboe}
133e0681f3edfb755e710fe7016e470d947bc5dbc3cJens Axboe
1342fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe/// EmitSectionOffset - Emit the 4-byte offset of Label from the start of its
1352fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe/// section.  This can be done with a special directive if the target supports
1362fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe/// it (e.g. cygwin) or by emitting it as an offset from a label at the start
1372fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe/// of the section.
13887d5f276b14f42b09062d499ebb3f524e3aa86f3Jens Axboe///
139f3e8440f75f98ced28cdd19ba785718e734cf7c5Jens Axboe/// SectionLabel is a temporary label emitted at the start of the section that
1402fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe/// Label lives in.
141b04ad8d1af96a011cf41c7c477fcddbb9e399b03Stephen M. Cameronvoid AsmPrinter::EmitSectionOffset(const MCSymbol *Label,
142019dd47743caec2954f9960d178516b760abca26Stephen M. Cameron                                   const MCSymbol *SectionLabel) const {
1432fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  // On COFF targets, we have to emit the special .secrel32 directive.
1442fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  if (MAI->getDwarfSectionOffsetDirective()) {
1459f4883aa0c1bf90a499e729389ca2169f4637a00Jens Axboe    OutStreamer.EmitCOFFSecRel32(Label);
1469f4883aa0c1bf90a499e729389ca2169f4637a00Jens Axboe    return;
147fe8afddb903447278f37afc4e1adb226ca2cb699Stephen M. Cameron  }
1482fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe
1492fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  // Get the section that we're referring to, based on SectionLabel.
1502fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  const MCSection &Section = SectionLabel->getSection();
1512fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe
1522fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  // If Label has already been emitted, verify that it is in the same section as
1532fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  // section label for sanity.
15487d5f276b14f42b09062d499ebb3f524e3aa86f3Jens Axboe  assert((!Label->isInSection() || &Label->getSection() == &Section) &&
155f3e8440f75f98ced28cdd19ba785718e734cf7c5Jens Axboe         "Section offset using wrong section base for label");
1562fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe
157b04ad8d1af96a011cf41c7c477fcddbb9e399b03Stephen M. Cameron  // If the section in question will end up with an address of 0 anyway, we can
158019dd47743caec2954f9960d178516b760abca26Stephen M. Cameron  // just emit an absolute reference to save a relocation.
1592fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  if (Section.isBaseAddressKnownZero()) {
1602fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe    OutStreamer.EmitSymbolValue(Label, 4, 0/*AddrSpace*/);
1619f4883aa0c1bf90a499e729389ca2169f4637a00Jens Axboe    return;
1629f4883aa0c1bf90a499e729389ca2169f4637a00Jens Axboe  }
163fe8afddb903447278f37afc4e1adb226ca2cb699Stephen M. Cameron
1642fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  // Otherwise, emit it as a label difference from the start of the section.
1652fd3bb0ecbe17e8168a480cbdb8318b69bf51087Jens Axboe  EmitLabelDifference(Label, SectionLabel, 4);
1668663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe}
1678663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe
1688663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe//===----------------------------------------------------------------------===//
1698663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe// Dwarf Lowering Routines
1708663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe//===----------------------------------------------------------------------===//
1718663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe
172ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe/// EmitCFIFrameMove - Emit a frame instruction.
173ca850992888df61f347ad839be0c4091ff25bea3Jens Axboevoid AsmPrinter::EmitCFIFrameMove(const MachineMove &Move) const {
174ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe  const TargetRegisterInfo *RI = TM.getRegisterInfo();
175ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe
176ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe  const MachineLocation &Dst = Move.getDestination();
177ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe  const MachineLocation &Src = Move.getSource();
178ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe
179ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe  // If advancing cfa.
180ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe  if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) {
181ca850992888df61f347ad839be0c4091ff25bea3Jens Axboe    if (Src.getReg() == MachineLocation::VirtualFP) {
1828663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe      OutStreamer.EmitCFIDefCfaOffset(-Src.getOffset());
1838663ea652b8ca7a368b39ef97e991180edebb57fJens Axboe    } else {
1843650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe      // Reg + Offset
1853650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe      OutStreamer.EmitCFIDefCfa(RI->getDwarfRegNum(Src.getReg(), true),
1863650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe                                Src.getOffset());
1873650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe    }
1883650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe  } else if (Src.isReg() && Src.getReg() == MachineLocation::VirtualFP) {
1893650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe    assert(Dst.isReg() && "Machine move not supported yet.");
1901c1e4a5bbe3ebb614eacfa902c06564e6739a750Jens Axboe    OutStreamer.EmitCFIDefCfaRegister(RI->getDwarfRegNum(Dst.getReg(), true));
1913650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe  } else {
1923650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe    assert(!Dst.isReg() && "Machine move not supported yet.");
1933650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe    OutStreamer.EmitCFIOffset(RI->getDwarfRegNum(Src.getReg(), true),
1943650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe                              Dst.getOffset());
1953650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe  }
1963650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe}
1973650a3ca2ccbfefe7564d6ebde03bf7f89255e89Jens Axboe