Change some methods in MCDwarf.cpp to be able to handle an arbitrary
MCStreamer instead of just MCObjectStreamer. Address changes cannot
be as efficient as we have to use DW_LNE_set_addres, but at least
most of the logic is shared.

This will be used so that, with CodeGen still using EmitDwarfLocDirective,
llvm-gcc is able to produce debug_line sections without needing an
assembler that supports .loc.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119777 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp
index 0abbe72..5954f62 100644
--- a/lib/CodeGen/LLVMTargetMachine.cpp
+++ b/lib/CodeGen/LLVMTargetMachine.cpp
@@ -20,6 +20,7 @@
 #include "llvm/CodeGen/MachineModuleInfo.h"
 #include "llvm/CodeGen/GCStrategy.h"
 #include "llvm/CodeGen/Passes.h"
+#include "llvm/Target/TargetLowering.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCStreamer.h"
@@ -144,11 +145,28 @@
     if (ShowMCEncoding)
       MCE = getTarget().createCodeEmitter(*this, *Context);
 
-    AsmStreamer.reset(getTarget().createAsmStreamer(*Context, Out,
-                                                    getTargetData()->isLittleEndian(),
-                                                    getVerboseAsm(),
-                                                    InstPrinter, MCE,
-                                                    ShowMCInst));
+    const TargetLoweringObjectFile &TLOF =
+      getTargetLowering()->getObjFileLowering();
+    int PointerSize = getTargetData()->getPointerSize();
+
+    MCStreamer *S;
+    if (hasMCUseLoc())
+      S = getTarget().createAsmStreamer(*Context, Out,
+                                        getTargetData()->isLittleEndian(),
+                                        getVerboseAsm(),
+                                        InstPrinter,
+                                        MCE,
+                                        ShowMCInst);
+    else
+      S = createAsmStreamerNoLoc(*Context, Out,
+                                 getTargetData()->isLittleEndian(),
+                                 getVerboseAsm(),
+                                 &TLOF,
+                                 PointerSize,
+                                 InstPrinter,
+                                 MCE,
+                                 ShowMCInst);
+    AsmStreamer.reset(S);
     break;
   }
   case CGFT_ObjectFile: {