Implement cfi_def_cfa. Also don't convert to dwarf reg numbers twice. Looks
like 6 is a fixed point of that and so the previous tests were OK :-)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122614 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp
index f3ba2bb..e11da37 100644
--- a/lib/MC/MCDwarf.cpp
+++ b/lib/MC/MCDwarf.cpp
@@ -440,10 +440,7 @@
 }
 
 static void EmitCFIInstruction(MCStreamer &Streamer,
-                               const MCCFIInstruction &Instr,
-                               bool isEH) {
-  MCContext &context = Streamer.getContext();
-  const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
+                               const MCCFIInstruction &Instr) {
   int dataAlignmentFactor = getDataAlignmentFactor(Streamer);
 
   switch (Instr.getOperation()) {
@@ -459,8 +456,7 @@
         Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa_offset, 1);
       } else {
         Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa, 1);
-        Streamer.EmitULEB128IntValue(asmInfo.getDwarfRegNum(Src.getReg(),
-                                                            isEH));
+        Streamer.EmitULEB128IntValue(Src.getReg());
       }
 
       Streamer.EmitULEB128IntValue(-Src.getOffset(), 1);
@@ -470,11 +466,11 @@
     if (Src.isReg() && Src.getReg() == MachineLocation::VirtualFP) {
       assert(Dst.isReg() && "Machine move not supported yet.");
       Streamer.EmitIntValue(dwarf::DW_CFA_def_cfa_register, 1);
-      Streamer.EmitULEB128IntValue(asmInfo.getDwarfRegNum(Dst.getReg(), isEH));
+      Streamer.EmitULEB128IntValue(Dst.getReg());
       return;
     }
 
-    unsigned Reg = asmInfo.getDwarfRegNum(Src.getReg(), isEH);
+    unsigned Reg = Src.getReg();
     int Offset = Dst.getOffset() / dataAlignmentFactor;
 
     if (Offset < 0) {
@@ -505,7 +501,7 @@
 /// frame.
 static void EmitCFIInstructions(MCStreamer &streamer,
                                 const std::vector<MCCFIInstruction> &Instrs,
-                                MCSymbol *BaseLabel, bool isEH) {
+                                MCSymbol *BaseLabel) {
   for (unsigned i = 0, N = Instrs.size(); i < N; ++i) {
     const MCCFIInstruction &Instr = Instrs[i];
     MCSymbol *Label = Instr.getLabel();
@@ -521,7 +517,7 @@
       }
     }
 
-    EmitCFIInstruction(streamer, Instr, isEH);
+    EmitCFIInstruction(streamer, Instr);
   }
 }
 
@@ -566,6 +562,17 @@
   }
 }
 
+static const MachineLocation TranslateMachineLocation(
+                                                  const TargetAsmInfo &AsmInfo,
+                                                  const MachineLocation &Loc) {
+  unsigned Reg = Loc.getReg() == MachineLocation::VirtualFP ?
+    MachineLocation::VirtualFP :
+    unsigned(AsmInfo.getDwarfRegNum(Loc.getReg(), true));
+  const MachineLocation &NewLoc = Loc.isReg() ?
+    MachineLocation(Reg) : MachineLocation(Reg, Loc.getOffset());
+  return NewLoc;
+}
+
 static const MCSymbol &EmitCIE(MCStreamer &streamer,
                                const MCSymbol *personality,
                                unsigned personalityEncoding,
@@ -640,12 +647,16 @@
   std::vector<MCCFIInstruction> Instructions;
 
   for (int i = 0, n = Moves.size(); i != n; ++i) {
-    MCCFIInstruction Inst(Moves[i].getLabel(), Moves[i].getDestination(),
-                          Moves[i].getSource());
+    MCSymbol *Label = Moves[i].getLabel();
+    const MachineLocation &Dst =
+      TranslateMachineLocation(asmInfo, Moves[i].getDestination());
+    const MachineLocation &Src =
+      TranslateMachineLocation(asmInfo, Moves[i].getSource());
+    MCCFIInstruction Inst(Label, Dst, Src);
     Instructions.push_back(Inst);
   }
 
-  EmitCFIInstructions(streamer, Instructions, NULL, true);
+  EmitCFIInstructions(streamer, Instructions, NULL);
 
   // Padding
   streamer.EmitValueToAlignment(4);
@@ -694,7 +705,7 @@
   streamer.EmitLabel(augmentationEnd);
   // Call Frame Instructions
 
-  EmitCFIInstructions(streamer, frame.Instructions, frame.Begin, true);
+  EmitCFIInstructions(streamer, frame.Instructions, frame.Begin);
 
   // Padding
   streamer.EmitValueToAlignment(4);