[llvm] r200440 - Reland r200340 - 'Add line table debug info to COFF files when using a win32 triple'

Timur Iskhodzhanov timurrrr at google.com
Thu Jan 30 09:59:54 PST 2014


Shoud be fixed in r200473.


2014-01-29 Timur Iskhodzhanov <timurrrr at google.com>

> Looks like this has failed on Atom, probably due to different
> optimizations.
>
> Unfortunately, I can't address this right now (late evening in my
> timezone. the bot is too slow...).
> I'd appreciate if someone could exclude these tests on Atom or somehow
> disable the atom-specific optimizations?
>
> How do I repro these failures locally?
>
> 2014-01-29 Timur Iskhodzhanov <timurrrr at google.com>:
> > Author: timurrrr
> > Date: Wed Jan 29 19:39:17 2014
> > New Revision: 200440
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=200440&view=rev
> > Log:
> > Reland r200340 - 'Add line table debug info to COFF files when using a
> win32 triple'
> >
> > This incorporates a couple of fixes reviewed at
> http://llvm-reviews.chandlerc.com/D2651
> >
> > Added:
> >     llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp
> >     llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.h
> >     llvm/trunk/test/DebugInfo/COFF/asm.ll
> >     llvm/trunk/test/DebugInfo/COFF/multifile.ll
> >     llvm/trunk/test/DebugInfo/COFF/multifunction.ll
> >     llvm/trunk/test/DebugInfo/COFF/simple.ll
> >     llvm/trunk/test/DebugInfo/X86/coff_debug_info_type.ll
> > Modified:
> >     llvm/trunk/include/llvm/Support/DebugLoc.h
> >     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> >     llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt
> >     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> >     llvm/trunk/lib/IR/DebugLoc.cpp
> >     llvm/trunk/lib/MC/MCObjectFileInfo.cpp
> >     llvm/trunk/test/DebugInfo/2010-03-24-MemberFn.ll
> >     llvm/trunk/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll
> >     llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll
> >     llvm/trunk/test/DebugInfo/2010-05-10-MultipleCU.ll
> >     llvm/trunk/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll
> >     llvm/trunk/test/DebugInfo/X86/coff_relative_names.ll
> >     llvm/trunk/test/DebugInfo/X86/dbg-byval-parameter.ll
> >     llvm/trunk/test/DebugInfo/array.ll
> >     llvm/trunk/test/DebugInfo/cu-ranges.ll
> >     llvm/trunk/test/DebugInfo/debug-info-qualifiers.ll
> >     llvm/trunk/test/DebugInfo/dwarf-public-names.ll
> >     llvm/trunk/test/DebugInfo/enum.ll
> >     llvm/trunk/test/DebugInfo/global.ll
> >     llvm/trunk/test/DebugInfo/inlined-arguments.ll
> >     llvm/trunk/test/DebugInfo/inlined-vars.ll
> >     llvm/trunk/test/DebugInfo/member-order.ll
> >     llvm/trunk/test/DebugInfo/member-pointers.ll
> >     llvm/trunk/test/DebugInfo/namespace.ll
> >     llvm/trunk/test/DebugInfo/template-recursive-void.ll
> >     llvm/trunk/test/DebugInfo/tu-composite.ll
> >     llvm/trunk/test/DebugInfo/tu-member-pointer.ll
> >     llvm/trunk/test/DebugInfo/two-cus-from-same-file.ll
> >     llvm/trunk/test/DebugInfo/version.ll
> >     llvm/trunk/test/Linker/type-unique-simple-a.ll
> >     llvm/trunk/test/Linker/type-unique-simple2-a.ll
> >     llvm/trunk/test/Linker/type-unique-simple2.ll
> >     llvm/trunk/test/lit.cfg
> >
> > Modified: llvm/trunk/include/llvm/Support/DebugLoc.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DebugLoc.h?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Support/DebugLoc.h (original)
> > +++ llvm/trunk/include/llvm/Support/DebugLoc.h Wed Jan 29 19:39:17 2014
> > @@ -89,6 +89,12 @@ namespace llvm {
> >      void getScopeAndInlinedAt(MDNode *&Scope, MDNode *&IA,
> >                                const LLVMContext &Ctx) const;
> >
> > +    /// getScopeNode - Get MDNode for DebugLoc's scope, or null if
> invalid.
> > +    MDNode *getScopeNode(const LLVMContext &Ctx) const;
> > +
> > +    // getFnDebugLoc - Walk up the scope chain of given debug loc and
> find line
> > +    // number info for the function.
> > +    DebugLoc getFnDebugLoc(const LLVMContext &Ctx);
> >
> >      /// getAsMDNode - This method converts the compressed DebugLoc node
> into a
> >      /// DILocation compatible MDNode.
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed Jan 29 19:39:17
> 2014
> > @@ -50,11 +50,13 @@
> >  #include "llvm/Target/TargetRegisterInfo.h"
> >  #include "llvm/Target/TargetSubtargetInfo.h"
> >  #include "llvm/Transforms/Utils/GlobalStatus.h"
> > +#include "WinCodeViewLineTables.h"
> >  using namespace llvm;
> >
> >  static const char *const DWARFGroupName = "DWARF Emission";
> > -static const char *const DbgTimerName = "DWARF Debug Writer";
> > +static const char *const DbgTimerName = "Debug Info Emission";
> >  static const char *const EHTimerName = "DWARF Exception Writer";
> > +static const char *const CodeViewLineTablesGroupName = "CodeView Line
> Tables";
> >
> >  STATISTIC(EmittedInsts, "Number of machine instrs printed");
> >
> > @@ -202,8 +204,14 @@ bool AsmPrinter::doInitialization(Module
> >    }
> >
> >    if (MAI->doesSupportDebugInformation()) {
> > -    DD = new DwarfDebug(this, &M);
> > -    Handlers.push_back(HandlerInfo(DD, DbgTimerName, DWARFGroupName));
> > +    if (Triple(TM.getTargetTriple()).getOS() == Triple::Win32) {
> > +      Handlers.push_back(HandlerInfo(new WinCodeViewLineTables(this),
> > +                                     DbgTimerName,
> > +                                     CodeViewLineTablesGroupName));
> > +    } else {
> > +      DD = new DwarfDebug(this, &M);
> > +      Handlers.push_back(HandlerInfo(DD, DbgTimerName, DWARFGroupName));
> > +    }
> >    }
> >
> >    DwarfException *DE = 0;
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt Wed Jan 29 19:39:17
> 2014
> > @@ -13,6 +13,7 @@ add_llvm_library(LLVMAsmPrinter
> >    ErlangGCPrinter.cpp
> >    OcamlGCPrinter.cpp
> >    Win64Exception.cpp
> > +  WinCodeViewLineTables.cpp
> >    )
> >
> >  add_dependencies(LLVMAsmPrinter intrinsics_gen)
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Jan 29 19:39:17
> 2014
> > @@ -1527,30 +1527,6 @@ void DwarfDebug::identifyScopeMarkers()
> >    }
> >  }
> >
> > -// Get MDNode for DebugLoc's scope.
> > -static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
> > -  if (MDNode *InlinedAt = DL.getInlinedAt(Ctx))
> > -    return getScopeNode(DebugLoc::getFromDILocation(InlinedAt), Ctx);
> > -  return DL.getScope(Ctx);
> > -}
> > -
> > -// Walk up the scope chain of given debug loc and find line number info
> > -// for the function.
> > -static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
> > -  const MDNode *Scope = getScopeNode(DL, Ctx);
> > -  DISubprogram SP = getDISubprogram(Scope);
> > -  if (SP.isSubprogram()) {
> > -    // Check for number of operands since the compatibility is
> > -    // cheap here.
> > -    if (SP->getNumOperands() > 19)
> > -      return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
> > -    else
> > -      return DebugLoc::get(SP.getLineNumber(), 0, SP);
> > -  }
> > -
> > -  return DebugLoc();
> > -}
> > -
> >  // Gather pre-function debug information.  Assumes being called
> immediately
> >  // after the function entry point has been emitted.
> >  void DwarfDebug::beginFunction(const MachineFunction *MF) {
> > @@ -1745,7 +1721,7 @@ void DwarfDebug::beginFunction(const Mac
> >    // Record beginning of function.
> >    if (!PrologEndLoc.isUnknown()) {
> >      DebugLoc FnStartDL =
> > -        getFnDebugLoc(PrologEndLoc, MF->getFunction()->getContext());
> > +        PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
> >      recordSourceLine(
> >          FnStartDL.getLine(), FnStartDL.getCol(),
> >          FnStartDL.getScope(MF->getFunction()->getContext()),
> >
> > Added: llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp?rev=200440&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp (added)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp Wed Jan
> 29 19:39:17 2014
> > @@ -0,0 +1,333 @@
> > +//===-- llvm/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.cpp --*- C++
> -*--===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +//
> > +// This file contains support for writing line tables info into COFF
> files.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#include "WinCodeViewLineTables.h"
> > +#include "llvm/MC/MCExpr.h"
> > +#include "llvm/MC/MCSymbol.h"
> > +#include "llvm/Support/COFF.h"
> > +
> > +namespace llvm {
> > +
> > +StringRef WinCodeViewLineTables::getFullFilepath(const MDNode *S) {
> > +  assert(S);
> > +  DIDescriptor D(S);
> > +  assert((D.isCompileUnit() || D.isFile() || D.isSubprogram() ||
> > +          D.isLexicalBlockFile() || D.isLexicalBlock()) &&
> > +         "Unexpected scope info");
> > +
> > +  DIScope Scope(S);
> > +  StringRef Dir = Scope.getDirectory(),
> > +            Filename = Scope.getFilename();
> > +  char *&Result = DirAndFilenameToFilepathMap[std::make_pair(Dir,
> Filename)];
> > +  if (Result != 0)
> > +    return Result;
> > +
> > +  // Clang emits directory and relative filename info into the IR, but
> CodeView
> > +  // operates on full paths.  We could change Clang to emit full paths
> too, but
> > +  // that would increase the IR size and probably not needed for other
> users.
> > +  // For now, just concatenate and canonicalize the path here.
> > +  std::string Filepath;
> > +  if (Filename.find(':') == 1)
> > +    Filepath = Filename;
> > +  else
> > +    Filepath = (Dir + Twine("\\") + Filename).str();
> > +
> > +  // Canonicalize the path.  We have to do it textually because we may
> no longer
> > +  // have access the file in the filesystem.
> > +  // First, replace all slashes with backslashes.
> > +  std::replace(Filepath.begin(), Filepath.end(), '/', '\\');
> > +
> > +  // Remove all "\.\" with "\".
> > +  size_t Cursor = 0;
> > +  while ((Cursor = Filepath.find("\\.\\", Cursor)) != std::string::npos)
> > +    Filepath.erase(Cursor, 2);
> > +
> > +  // Replace all "\XXX\..\" with "\".  Don't try too hard though as the
> original
> > +  // path should be well-formatted, e.g. start with a drive letter, etc.
> > +  Cursor = 0;
> > +  while ((Cursor = Filepath.find("\\..\\", Cursor)) !=
> std::string::npos) {
> > +    // Something's wrong if the path starts with "\..\", abort.
> > +    if (Cursor == 0)
> > +      break;
> > +
> > +    size_t PrevSlash = Filepath.rfind('\\', Cursor - 1);
> > +    if (PrevSlash == std::string::npos)
> > +      // Something's wrong, abort.
> > +      break;
> > +
> > +    Filepath.erase(PrevSlash, Cursor + 3 - PrevSlash);
> > +    // The next ".." might be following the one we've just erased.
> > +    Cursor = PrevSlash;
> > +  }
> > +
> > +  // Remove all duplicate backslashes.
> > +  Cursor = 0;
> > +  while ((Cursor = Filepath.find("\\\\", Cursor)) != std::string::npos)
> > +    Filepath.erase(Cursor, 1);
> > +
> > +  Result = strdup(Filepath.c_str());
> > +  return StringRef(Result);
> > +}
> > +
> > +void WinCodeViewLineTables::maybeRecordLocation(DebugLoc DL,
> > +                                                const MachineFunction
> *MF) {
> > +  const MDNode *Scope = DL.getScope(MF->getFunction()->getContext());
> > +  if (!Scope)
> > +    return;
> > +  StringRef Filename = getFullFilepath(Scope);
> > +
> > +  // Skip this instruction if it has the same file:line as the previous
> one.
> > +  assert(CurFn);
> > +  if (!CurFn->Instrs.empty()) {
> > +    const InstrInfoTy &LastInstr = InstrInfo[CurFn->Instrs.back()];
> > +    if (LastInstr.Filename == Filename && LastInstr.LineNumber ==
> DL.getLine())
> > +      return;
> > +  }
> > +  FileNameRegistry.add(Filename);
> > +
> > +  MCSymbol *MCL = Asm->MMI->getContext().CreateTempSymbol();
> > +  Asm->OutStreamer.EmitLabel(MCL);
> > +  CurFn->Instrs.push_back(MCL);
> > +  InstrInfo[MCL] = InstrInfoTy(Filename, DL.getLine());
> > +}
> > +
> > +WinCodeViewLineTables::WinCodeViewLineTables(AsmPrinter *AP)
> > +    : Asm(0), CurFn(0) {
> > +  MachineModuleInfo *MMI = AP->MMI;
> > +
> > +  // If module doesn't have named metadata anchors or COFF debug section
> > +  // is not available, skip any debug info related stuff.
> > +  if (!MMI->getModule()->getNamedMetadata("llvm.dbg.cu") ||
> > +      !AP->getObjFileLowering().getCOFFDebugSymbolsSection())
> > +    return;
> > +
> > +  // Tell MMI that we have debug info.
> > +  MMI->setDebugInfoAvailability(true);
> > +  Asm = AP;
> > +}
> > +
> > +static void EmitLabelDiff(MCStreamer &Streamer,
> > +                          const MCSymbol *From, const MCSymbol *To) {
> > +  MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
> > +  MCContext &Context = Streamer.getContext();
> > +  const MCExpr *FromRef = MCSymbolRefExpr::Create(From, Variant,
> Context),
> > +               *ToRef   = MCSymbolRefExpr::Create(To, Variant, Context);
> > +  const MCExpr *AddrDelta =
> > +      MCBinaryExpr::Create(MCBinaryExpr::Sub, ToRef, FromRef, Context);
> > +  Streamer.EmitValue(AddrDelta, 4);
> > +}
> > +
> > +void WinCodeViewLineTables::emitDebugInfoForFunction(const Function
> *GV) {
> > +  // For each function there is a separate subsection
> > +  // which holds the PC to file:line table.
> > +  const MCSymbol *Fn = Asm->getSymbol(GV);
> > +  const FunctionInfo &FI = FnDebugInfo[GV];
> > +  assert(Fn);
> > +  assert(FI.Instrs.size() > 0);
> > +
> > +  // PCs/Instructions are grouped into segments sharing the same
> filename.
> > +  // Pre-calculate the lengths (in instructions) of these segments and
> store
> > +  // them in a map for convenience.  Each index in the map is the
> sequential
> > +  // number of the respective instruction that starts a new segment.
> > +  DenseMap<size_t, size_t> FilenameSegmentLengths;
> > +  size_t LastSegmentEnd = 0;
> > +  StringRef PrevFilename = InstrInfo[FI.Instrs[0]].Filename;
> > +  for (size_t J = 1, F = FI.Instrs.size(); J != F; ++J) {
> > +    if (PrevFilename == InstrInfo[FI.Instrs[J]].Filename)
> > +      continue;
> > +    FilenameSegmentLengths[LastSegmentEnd] = J - LastSegmentEnd;
> > +    LastSegmentEnd = J;
> > +    PrevFilename = InstrInfo[FI.Instrs[J]].Filename;
> > +  }
> > +  FilenameSegmentLengths[LastSegmentEnd] = FI.Instrs.size() -
> LastSegmentEnd;
> > +
> > +  // Emit the control code of the subsection followed by the payload
> size.
> > +  Asm->OutStreamer.AddComment(
> > +      "Linetable subsection for " + Twine(Fn->getName()));
> > +  Asm->EmitInt32(COFF::DEBUG_LINE_TABLE_SUBSECTION);
> > +  MCSymbol *SubsectionBegin = Asm->MMI->getContext().CreateTempSymbol(),
> > +           *SubsectionEnd = Asm->MMI->getContext().CreateTempSymbol();
> > +  EmitLabelDiff(Asm->OutStreamer, SubsectionBegin, SubsectionEnd);
> > +  Asm->OutStreamer.EmitLabel(SubsectionBegin);
> > +
> > +  // Identify the function this subsection is for.
> > +  Asm->OutStreamer.EmitCOFFSecRel32(Fn);
> > +  Asm->OutStreamer.EmitCOFFSectionIndex(Fn);
> > +
> > +  // Length of the function's code, in bytes.
> > +  EmitLabelDiff(Asm->OutStreamer, Fn, FI.End);
> > +
> > +  // PC-to-linenumber lookup table:
> > +  MCSymbol *FileSegmentEnd = 0;
> > +  for (size_t J = 0, F = FI.Instrs.size(); J != F; ++J) {
> > +    MCSymbol *Instr = FI.Instrs[J];
> > +    assert(InstrInfo.count(Instr));
> > +
> > +    if (FilenameSegmentLengths.count(J)) {
> > +      // We came to a beginning of a new filename segment.
> > +      if (FileSegmentEnd)
> > +        Asm->OutStreamer.EmitLabel(FileSegmentEnd);
> > +      StringRef CurFilename = InstrInfo[FI.Instrs[J]].Filename;
> > +      assert(FileNameRegistry.Infos.count(CurFilename));
> > +      size_t IndexInStringTable =
> > +          FileNameRegistry.Infos[CurFilename].FilenameID;
> > +      // Each segment starts with the offset of the filename
> > +      // in the string table.
> > +      Asm->OutStreamer.AddComment(
> > +          "Segment for file '" + Twine(CurFilename) + "' begins");
> > +      MCSymbol *FileSegmentBegin =
> Asm->MMI->getContext().CreateTempSymbol();
> > +      Asm->OutStreamer.EmitLabel(FileSegmentBegin);
> > +      Asm->EmitInt32(8 * IndexInStringTable);
> > +
> > +      // Number of PC records in the lookup table.
> > +      size_t SegmentLength = FilenameSegmentLengths[J];
> > +      Asm->EmitInt32(SegmentLength);
> > +
> > +      // Full size of the segment for this filename, including the prev
> two
> > +      // records.
> > +      FileSegmentEnd = Asm->MMI->getContext().CreateTempSymbol();
> > +      EmitLabelDiff(Asm->OutStreamer, FileSegmentBegin, FileSegmentEnd);
> > +    }
> > +
> > +    // The first PC with the given linenumber and the linenumber itself.
> > +    EmitLabelDiff(Asm->OutStreamer, Fn, Instr);
> > +    Asm->EmitInt32(InstrInfo[Instr].LineNumber);
> > +  }
> > +
> > +  if (FileSegmentEnd)
> > +    Asm->OutStreamer.EmitLabel(FileSegmentEnd);
> > +  Asm->OutStreamer.EmitLabel(SubsectionEnd);
> > +}
> > +
> > +void WinCodeViewLineTables::endModule() {
> > +  if (FnDebugInfo.empty())
> > +    return;
> > +
> > +  assert(Asm != 0);
> > +  Asm->OutStreamer.SwitchSection(
> > +      Asm->getObjFileLowering().getCOFFDebugSymbolsSection());
> > +  Asm->EmitInt32(COFF::DEBUG_SECTION_MAGIC);
> > +
> > +  // The COFF .debug$S section consists of several subsections, each
> starting
> > +  // with a 4-byte control code (e.g. 0xF1, 0xF2, etc) and then a
> 4-byte length
> > +  // of the payload followed by the payload itself.  The subsections
> are 4-byte
> > +  // aligned.
> > +
> > +  for (size_t I = 0, E = VisitedFunctions.size(); I != E; ++I)
> > +    emitDebugInfoForFunction(VisitedFunctions[I]);
> > +
> > +  // This subsection holds a file index to offset in string table table.
> > +  Asm->OutStreamer.AddComment("File index to string table offset
> subsection");
> > +  Asm->EmitInt32(COFF::DEBUG_INDEX_SUBSECTION);
> > +  size_t NumFilenames = FileNameRegistry.Infos.size();
> > +  Asm->EmitInt32(8 * NumFilenames);
> > +  for (size_t I = 0, E = FileNameRegistry.Filenames.size(); I != E;
> ++I) {
> > +    StringRef Filename = FileNameRegistry.Filenames[I];
> > +    // For each unique filename, just write it's offset in the string
> table.
> > +    Asm->EmitInt32(FileNameRegistry.Infos[Filename].StartOffset);
> > +    // The function name offset is not followed by any additional data.
> > +    Asm->EmitInt32(0);
> > +  }
> > +
> > +  // This subsection holds the string table.
> > +  Asm->OutStreamer.AddComment("String table");
> > +  Asm->EmitInt32(COFF::DEBUG_STRING_TABLE_SUBSECTION);
> > +  Asm->EmitInt32(FileNameRegistry.LastOffset);
> > +  // The payload starts with a null character.
> > +  Asm->EmitInt8(0);
> > +
> > +  for (size_t I = 0, E = FileNameRegistry.Filenames.size(); I != E;
> ++I) {
> > +    // Just emit unique filenames one by one, separated by a null
> character.
> > +    Asm->OutStreamer.EmitBytes(FileNameRegistry.Filenames[I]);
> > +    Asm->EmitInt8(0);
> > +  }
> > +
> > +  // No more subsections. Fill with zeros to align the end of the
> section by 4.
> > +  Asm->OutStreamer.EmitFill((-FileNameRegistry.LastOffset) % 4, 0);
> > +
> > +  clear();
> > +}
> > +
> > +void WinCodeViewLineTables::beginFunction(const MachineFunction *MF) {
> > +  assert(!CurFn && "Can't process two functions at once!");
> > +
> > +  if (!Asm || !Asm->MMI->hasDebugInfo())
> > +    return;
> > +
> > +  // Grab the lexical scopes for the function, if we don't have any of
> those
> > +  // then we're not going to be able to do anything.
> > +  LScopes.initialize(*MF);
> > +  if (LScopes.empty())
> > +    return;
> > +
> > +  const Function *GV = MF->getFunction();
> > +  assert(FnDebugInfo.count(GV) == false);
> > +  VisitedFunctions.push_back(GV);
> > +  CurFn = &FnDebugInfo[GV];
> > +
> > +  // Find the end of the function prolog.
> > +  // FIXME: is there a simpler a way to do this? Can we just search
> > +  // for the first instruction of the function, not the last of the
> prolog?
> > +  DebugLoc PrologEndLoc;
> > +  bool EmptyPrologue = true;
> > +  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
> > +       I != E && PrologEndLoc.isUnknown(); ++I) {
> > +    for (MachineBasicBlock::const_iterator II = I->begin(), IE =
> I->end();
> > +         II != IE; ++II) {
> > +      const MachineInstr *MI = II;
> > +      if (MI->isDebugValue())
> > +        continue;
> > +
> > +      // First known non-DBG_VALUE and non-frame setup location marks
> > +      // the beginning of the function body.
> > +      // FIXME: do we need the first subcondition?
> > +      if (!MI->getFlag(MachineInstr::FrameSetup) &&
> > +          (!MI->getDebugLoc().isUnknown())) {
> > +        PrologEndLoc = MI->getDebugLoc();
> > +        break;
> > +      }
> > +      EmptyPrologue = false;
> > +    }
> > +  }
> > +  // Record beginning of function if we have a non-empty prologue.
> > +  if (!PrologEndLoc.isUnknown() && !EmptyPrologue) {
> > +    DebugLoc FnStartDL =
> > +        PrologEndLoc.getFnDebugLoc(MF->getFunction()->getContext());
> > +    maybeRecordLocation(FnStartDL, MF);
> > +  }
> > +}
> > +
> > +void WinCodeViewLineTables::endFunction(const MachineFunction *) {
> > +  if (!Asm || !CurFn)  // We haven't created any debug info for this
> function.
> > +    return;
> > +
> > +  if (CurFn->Instrs.empty())
> > +    llvm_unreachable("Can this ever happen?");
> > +
> > +  // Define end label for subprogram.
> > +  MCSymbol *FunctionEndSym =
> Asm->OutStreamer.getContext().CreateTempSymbol();
> > +  Asm->OutStreamer.EmitLabel(FunctionEndSym);
> > +  CurFn->End = FunctionEndSym;
> > +  CurFn = 0;
> > +}
> > +
> > +void WinCodeViewLineTables::beginInstruction(const MachineInstr *MI) {
> > +  // Ignore DBG_VALUE locations and function prologue.
> > +  if (!Asm || MI->isDebugValue() ||
> MI->getFlag(MachineInstr::FrameSetup))
> > +    return;
> > +  DebugLoc DL = MI->getDebugLoc();
> > +  if (DL == PrevInstLoc || DL.isUnknown())
> > +    return;
> > +  maybeRecordLocation(DL, Asm->MF);
> > +}
> > +}
> >
> > Added: llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.h?rev=200440&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.h (added)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.h Wed Jan 29
> 19:39:17 2014
> > @@ -0,0 +1,144 @@
> > +//===-- llvm/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.h ----*- C++
> -*--===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +//
> > +// This file contains support for writing line tables info into COFF
> files.
> > +//
> >
> +//===----------------------------------------------------------------------===//
> > +
> > +#ifndef CODEGEN_ASMPRINTER_WINCODEVIEWLINETABLES_H__
> > +#define CODEGEN_ASMPRINTER_WINCODEVIEWLINETABLES_H__
> > +
> > +#include "AsmPrinterHandler.h"
> > +#include "llvm/ADT/DenseMap.h"
> > +#include "llvm/ADT/StringMap.h"
> > +#include "llvm/ADT/StringRef.h"
> > +#include "llvm/DebugInfo.h"
> > +#include "llvm/CodeGen/AsmPrinter.h"
> > +#include "llvm/CodeGen/MachineFunction.h"
> > +#include "llvm/CodeGen/MachineModuleInfo.h"
> > +#include "llvm/CodeGen/LexicalScopes.h"
> > +#include "llvm/MC/MCStreamer.h"
> > +#include "llvm/Support/DebugLoc.h"
> > +#include "llvm/Target/TargetLoweringObjectFile.h"
> > +
> > +namespace llvm {
> > +/// \brief Collects and handles line tables information in a CodeView
> format.
> > +class WinCodeViewLineTables : public AsmPrinterHandler {
> > +  AsmPrinter *Asm;
> > +  DebugLoc PrevInstLoc;
> > +  LexicalScopes LScopes;
> > +
> > +  // For each function, store a vector of labels to its instructions,
> as well as
> > +  // to the end of the function.
> > +  struct FunctionInfo {
> > +    SmallVector<MCSymbol *, 10> Instrs;
> > +    MCSymbol *End;
> > +  } *CurFn;
> > +
> > +  typedef DenseMap<const Function *, FunctionInfo> FnDebugInfoTy;
> > +  FnDebugInfoTy FnDebugInfo;
> > +  // Store the functions we've visited in a vector so we can maintain a
> stable
> > +  // order while emitting subsections.
> > +  SmallVector<const Function *, 10> VisitedFunctions;
> > +
> > +  // InstrInfoTy - Holds the Filename:LineNumber information for every
> > +  // instruction with a unique debug location.
> > +  struct InstrInfoTy {
> > +    StringRef Filename;
> > +    unsigned LineNumber;
> > +
> > +    InstrInfoTy() : LineNumber(0) {}
> > +
> > +    InstrInfoTy(StringRef Filename, unsigned LineNumber)
> > +        : Filename(Filename), LineNumber(LineNumber) {}
> > +  };
> > +  DenseMap<MCSymbol *, InstrInfoTy> InstrInfo;
> > +
> > +  // FileNameRegistry - Manages filenames observed while generating
> debug info
> > +  // by filtering out duplicates and bookkeeping the offsets in the
> string
> > +  // table to be generated.
> > +  struct FileNameRegistryTy {
> > +    SmallVector<StringRef, 10> Filenames;
> > +    struct PerFileInfo {
> > +      size_t FilenameID, StartOffset;
> > +    };
> > +    StringMap<PerFileInfo> Infos;
> > +
> > +    // The offset in the string table where we'll write the next unique
> > +    // filename.
> > +    size_t LastOffset;
> > +
> > +    FileNameRegistryTy() {
> > +      clear();
> > +    }
> > +
> > +    // Add Filename to the registry, if it was not observed before.
> > +    void add(StringRef Filename) {
> > +      if (Infos.count(Filename))
> > +        return;
> > +      size_t OldSize = Infos.size();
> > +      Infos[Filename].FilenameID = OldSize;
> > +      Infos[Filename].StartOffset = LastOffset;
> > +      LastOffset += Filename.size() + 1;
> > +      Filenames.push_back(Filename);
> > +    }
> > +
> > +    void clear() {
> > +      LastOffset = 1;
> > +      Infos.clear();
> > +      Filenames.clear();
> > +    }
> > +  } FileNameRegistry;
> > +
> > +  typedef std::map<std::pair<StringRef, StringRef>, char *>
> > +      DirAndFilenameToFilepathMapTy;
> > +  DirAndFilenameToFilepathMapTy DirAndFilenameToFilepathMap;
> > +  StringRef getFullFilepath(const MDNode *S);
> > +
> > +  void maybeRecordLocation(DebugLoc DL, const MachineFunction *MF);
> > +
> > +  void clear() {
> > +    assert(CurFn == 0);
> > +    FileNameRegistry.clear();
> > +    InstrInfo.clear();
> > +  }
> > +
> > +  void emitDebugInfoForFunction(const Function *GV);
> > +
> > +public:
> > +  WinCodeViewLineTables(AsmPrinter *Asm);
> > +
> > +  ~WinCodeViewLineTables() {
> > +    for (DirAndFilenameToFilepathMapTy::iterator
> > +             I = DirAndFilenameToFilepathMap.begin(),
> > +             E = DirAndFilenameToFilepathMap.end();
> > +         I != E; ++I)
> > +      free(I->second);
> > +  }
> > +
> > +  virtual void setSymbolSize(const llvm::MCSymbol *, uint64_t) {}
> > +
> > +  /// \brief Emit the COFF section that holds the line table
> information.
> > +  virtual void endModule();
> > +
> > +  /// \brief Gather pre-function debug information.
> > +  virtual void beginFunction(const MachineFunction *MF);
> > +
> > +  /// \brief Gather post-function debug information.
> > +  virtual void endFunction(const MachineFunction *);
> > +
> > +  /// \brief Process beginning of an instruction.
> > +  virtual void beginInstruction(const MachineInstr *MI);
> > +
> > +  /// \brief Process end of an instruction.
> > +  virtual void endInstruction() {}
> > +};
> > +} // End of namespace llvm
> > +
> > +#endif
> >
> > Modified: llvm/trunk/lib/IR/DebugLoc.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugLoc.cpp?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/IR/DebugLoc.cpp (original)
> > +++ llvm/trunk/lib/IR/DebugLoc.cpp Wed Jan 29 19:39:17 2014
> > @@ -70,6 +70,26 @@ void DebugLoc::getScopeAndInlinedAt(MDNo
> >    IA    = Ctx.pImpl->ScopeInlinedAtRecords[-ScopeIdx-1].second.get();
> >  }
> >
> > +MDNode *DebugLoc::getScopeNode(const LLVMContext &Ctx) const {
> > +  if (MDNode *InlinedAt = getInlinedAt(Ctx))
> > +    return DebugLoc::getFromDILocation(InlinedAt).getScopeNode(Ctx);
> > +  return getScope(Ctx);
> > +}
> > +
> > +DebugLoc DebugLoc::getFnDebugLoc(const LLVMContext &Ctx) {
> > +  const MDNode *Scope = getScopeNode(Ctx);
> > +  DISubprogram SP = getDISubprogram(Scope);
> > +  if (SP.isSubprogram()) {
> > +    // Check for number of operands since the compatibility is
> > +    // cheap here.  FIXME: Name the magic constant.
> > +    if (SP->getNumOperands() > 19)
> > +      return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
> > +    else
> > +      return DebugLoc::get(SP.getLineNumber(), 0, SP);
> > +  }
> > +
> > +  return DebugLoc();
> > +}
> >
> >  DebugLoc DebugLoc::get(unsigned Line, unsigned Col,
> >                         MDNode *Scope, MDNode *InlinedAt) {
> >
> > Modified: llvm/trunk/lib/MC/MCObjectFileInfo.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectFileInfo.cpp?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/MC/MCObjectFileInfo.cpp (original)
> > +++ llvm/trunk/lib/MC/MCObjectFileInfo.cpp Wed Jan 29 19:39:17 2014
> > @@ -150,6 +150,8 @@ void MCObjectFileInfo::InitMachOMCObject
> >    LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
> >                                       SectionKind::getReadOnlyWithRel());
> >
> > +  COFFDebugSymbolsSection = 0;
> > +
> >    if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) {
> >      CompactUnwindSection =
> >        Ctx->getMachOSection("__LD", "__compact_unwind",
> > @@ -458,6 +460,8 @@ void MCObjectFileInfo::InitELFMCObjectFi
> >                         ELF::SHF_ALLOC,
> >                         SectionKind::getReadOnly());
> >
> > +  COFFDebugSymbolsSection = 0;
> > +
> >    // Debug Info Sections.
> >    DwarfAbbrevSection =
> >      Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
> >
> > Modified: llvm/trunk/test/DebugInfo/2010-03-24-MemberFn.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-03-24-MemberFn.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/2010-03-24-MemberFn.ll (original)
> > +++ llvm/trunk/test/DebugInfo/2010-03-24-MemberFn.ll Wed Jan 29 19:39:17
> 2014
> > @@ -1,4 +1,4 @@
> > -; RUN: llc -O0 < %s | grep AT_decl_file |  grep 2
> > +; RUN: %llc_dwarf -O0 < %s | grep AT_decl_file |  grep 2
> >  ; Here _ZN1S3fooEv is defined in header file identified as AT_decl_file
> no. 2 in debug info.
> >  %struct.S = type <{ i8 }>
> >
> >
> > Modified: llvm/trunk/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll (original)
> > +++ llvm/trunk/test/DebugInfo/2010-04-06-NestedFnDbgInfo.ll Wed Jan 29
> 19:39:17 2014
> > @@ -1,4 +1,4 @@
> > -; RUN: llvm-as < %s | llc -asm-verbose -O0 | grep AT_specification |
> count 2
> > +; RUN: llvm-as < %s | %llc_dwarf -asm-verbose -O0 | grep
> AT_specification | count 2
> >  ; Radar 7833483
> >  ; Do not emit AT_specification for nested function foo.
> >
> >
> > Modified: llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll (original)
> > +++ llvm/trunk/test/DebugInfo/2010-04-19-FramePtr.ll Wed Jan 29 19:39:17
> 2014
> > @@ -1,6 +1,6 @@
> > -; RUN: llc -asm-verbose -O1 -o %t < %s
> > +; RUN: %llc_dwarf -asm-verbose -O1 -o %t < %s
> >  ; RUN: grep DW_AT_APPLE_omit_frame_ptr %t
> > -; RUN: llc -disable-fp-elim -asm-verbose -O1 -o %t < %s
> > +; RUN: %llc_dwarf -disable-fp-elim -asm-verbose -O1 -o %t < %s
> >  ; RUN: grep -v DW_AT_APPLE_omit_frame_ptr %t
> >
> >
> >
> > Modified: llvm/trunk/test/DebugInfo/2010-05-10-MultipleCU.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-05-10-MultipleCU.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/2010-05-10-MultipleCU.ll (original)
> > +++ llvm/trunk/test/DebugInfo/2010-05-10-MultipleCU.ll Wed Jan 29
> 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - |
> FileCheck %s
> > +; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump
> -debug-dump=info - | FileCheck %s
> >
> >  ; Check that two compile units are generated
> >
> >
> > Modified: llvm/trunk/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll (original)
> > +++ llvm/trunk/test/DebugInfo/2010-06-29-InlinedFnLocalVar.ll Wed Jan 29
> 19:39:17 2014
> > @@ -1,4 +1,4 @@
> > -; RUN: llc -O2 %s -o - | FileCheck %s
> > +; RUN: %llc_dwarf -O2 %s -o - | FileCheck %s
> >  ; Check struct X for dead variable xyz from inlined function foo.
> >
> >  ; CHECK:       DW_TAG_structure_type
> >
> > Added: llvm/trunk/test/DebugInfo/COFF/asm.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/asm.ll?rev=200440&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/asm.ll (added)
> > +++ llvm/trunk/test/DebugInfo/COFF/asm.ll Wed Jan 29 19:39:17 2014
> > @@ -0,0 +1,183 @@
> > +; RUN: llc -mtriple=i686-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X86 %s
> > +; RUN: llc -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ32 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X64 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ64 %s
> > +
> > +; This LL file was generated by running clang on the following code:
> > +; D:\asm.c:
> > +;  1 void g(void);
> > +;  2
> > +;  3 void f(void) {
> > +;  4   __asm align 4;
> > +;  5   g();
> > +;  6 }
> > +
> > +; X86: _f:
> > +; X86-NEXT: # BB
> > +; X86-NEXT: [[ASM_LINE:^L.*]]:{{$}}
> > +; X86:      [[CALL_LINE:^L.*]]:{{$}}
> > +; X86-NEXT: calll   _g
> > +; X86-NEXT: [[RETURN_STMT:.*]]:
> > +; X86-NEXT: ret
> > +; X86-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X86: .section        .debug$S,"rn"
> > +; X86-NEXT: .long   4
> > +; X86-NEXT: .long   242
> > +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X86-NEXT: [[F2_START]]:
> > +; X86-NEXT: .secrel32 _f
> > +; X86-NEXT: .secidx _f
> > +; X86-NEXT: .long [[END_OF_F]]-_f
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   3
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[ASM_LINE]]-_f
> > +; X86-NEXT: .long   4
> > +; X86-NEXT: .long [[CALL_LINE]]-_f
> > +; X86-NEXT: .long   5
> > +; X86-NEXT: .long [[RETURN_STMT]]-_f
> > +; X86-NEXT: .long   6
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; X86-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X86-NEXT: .long   244
> > +; X86-NEXT: .long   8
> > +; X86-NEXT: .long   1
> > +; X86-NEXT: .long   0
> > +; String table
> > +; X86-NEXT: .long   243
> > +; X86-NEXT: .long   10
> > +; X86-NEXT: .byte   0
> > +; X86-NEXT: .ascii  "D:\\asm.c"
> > +; X86-NEXT: .byte   0
> > +; Padding
> > +; X86-NEXT: .zero   2
> > +
> > +; OBJ32:    Section {
> > +; OBJ32:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ32:      Characteristics [ (0x42100040)
> > +; OBJ32:      ]
> > +; OBJ32:      Relocations [
> > +; OBJ32-NEXT:   0xC IMAGE_REL_I386_SECREL _f
> > +; OBJ32-NEXT:   0x10 IMAGE_REL_I386_SECTION _f
> > +; OBJ32-NEXT: ]
> > +; OBJ32:      FunctionLineTable [
> > +; OBJ32-NEXT:   Name: _f
> > +; OBJ32-NEXT:   CodeSize: 0x6
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\asm.c
> > +; FIXME: An empty __asm stmt creates an extra entry.
> > +; We seem to know that these offsets are the same statically during the
> > +; execution of endModule().
> > +; OBJ32-NEXT:     +0x0: 4
> > +; OBJ32-NEXT:     +0x0: 5
> > +; OBJ32-NEXT:     +0x5: 6
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT: ]
> > +; OBJ32:    }
> > +
> > +; X64: f:
> > +; X64-NEXT: [[START:.*]]:{{$}}
> > +; X64-NEXT: # BB
> > +; X64-NEXT: subq    $40, %rsp
> > +; X64-NEXT: [[ASM_LINE:.*]]:{{$}}
> > +; X64:      [[CALL_LINE:.*]]:{{$}}
> > +; X64-NEXT: callq   g
> > +; X64-NEXT: [[EPILOG_AND_RET:.*]]:
> > +; X64-NEXT: addq    $40, %rsp
> > +; X64-NEXT: ret
> > +; X64-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X64: .section        .debug$S,"rn"
> > +; X64-NEXT: .long   4
> > +; X64-NEXT: .long   242
> > +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X64-NEXT: [[F2_START]]:
> > +; X64-NEXT: .secrel32 f
> > +; X64-NEXT: .secidx f
> > +; X64-NEXT: .long [[END_OF_F]]-f
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   4
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[START]]-f
> > +; X64-NEXT: .long   3
> > +; X64-NEXT: .long [[ASM_LINE]]-f
> > +; X64-NEXT: .long   4
> > +; X64-NEXT: .long [[CALL_LINE]]-f
> > +; X64-NEXT: .long   5
> > +; X64-NEXT: .long [[EPILOG_AND_RET]]-f
> > +; X64-NEXT: .long   6
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; X64-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X64-NEXT: .long   244
> > +; X64-NEXT: .long   8
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: .long   0
> > +; String table
> > +; X64-NEXT: .long   243
> > +; X64-NEXT: .long   10
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .ascii  "D:\\asm.c"
> > +; X64-NEXT: .byte   0
> > +; Padding
> > +; X64-NEXT: .zero   2
> > +
> > +; OBJ64:    Section {
> > +; OBJ64:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ64:      Characteristics [ (0x42100040)
> > +; OBJ64:      ]
> > +; OBJ64:      Relocations [
> > +; OBJ64-NEXT:   0xC IMAGE_REL_AMD64_SECREL f
> > +; OBJ64-NEXT:   0x10 IMAGE_REL_AMD64_SECTION f
> > +; OBJ64-NEXT: ]
> > +; OBJ64:      FunctionLineTable [
> > +; OBJ64-NEXT:   Name: f
> > +; OBJ64-NEXT:   CodeSize: 0xE
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\asm.c
> > +; OBJ64-NEXT:     +0x0: 3
> > +; FIXME: An empty __asm stmt creates an extra entry.
> > +; OBJ64-NEXT:     +0x4: 4
> > +; OBJ64-NEXT:     +0x4: 5
> > +; OBJ64-NEXT:     +0x9: 6
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT: ]
> > +; OBJ64:    }
> > +
> > +; Function Attrs: nounwind
> > +define void @f() #0 {
> > +entry:
> > +  call void asm sideeffect inteldialect ".align 4",
> "~{dirflag},~{fpsr},~{flags}"() #2, !dbg !12
> > +  call void @g(), !dbg !13
> > +  ret void, !dbg !14
> > +}
> > +
> > +declare void @g() #1
> > +
> > +attributes #0 = { nounwind "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +attributes #1 = { "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +attributes #2 = { nounwind }
> > +
> > +!llvm.dbg.cu = !{!0}
> > +!llvm.module.flags = !{!9, !10}
> > +!llvm.ident = !{!11}
> > +
> > +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !2, metadata !2, metadata !""} ; [
> DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99]
> > +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"}
> > +!2 = metadata !{i32 0}
> > +!3 = metadata !{metadata !4}
> > +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f",
> metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0,
> i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32
> 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f]
> > +!5 = metadata !{metadata !"asm.c", metadata !"D:\5C"}
> > +!6 = metadata !{i32 786473, metadata !5}          ; [ DW_TAG_file_type
> ] [D:\/asm.c]
> > +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> > +!8 = metadata !{null}
> > +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> > +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> > +!11 = metadata !{metadata !"clang version 3.5 "}
> > +!12 = metadata !{i32 4, i32 0, metadata !4, null}
> > +!13 = metadata !{i32 5, i32 0, metadata !4, null}
> > +!14 = metadata !{i32 6, i32 0, metadata !4, null}
> >
> > Added: llvm/trunk/test/DebugInfo/COFF/multifile.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/multifile.ll?rev=200440&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/multifile.ll (added)
> > +++ llvm/trunk/test/DebugInfo/COFF/multifile.ll Wed Jan 29 19:39:17 2014
> > @@ -0,0 +1,257 @@
> > +; RUN: llc -mtriple=i686-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X86 %s
> > +; RUN: llc -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ32 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X64 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ64 %s
> > +
> > +; This LL file was generated by running clang on the following code:
> > +; D:\input.c:
> > +;  1 void g(void);
> > +;  2
> > +;  3 void f() {
> > +;  4 #line 1 "one.c"
> > +;  5   g(void);
> > +;  6 #line 2 "two.c"
> > +;  7   g(void);
> > +;  8 #line 7 "one.c"
> > +;  9   g(void);
> > +; 10 }
> > +
> > +; X86: _f:
> > +; X86-NEXT: # BB
> > +; X86-NEXT: [[CALL_LINE_1:.*]]:{{$}}
> > +; X86-NEXT: calll   _g
> > +; X86-NEXT: [[CALL_LINE_2:.*]]:{{$}}
> > +; X86-NEXT: calll   _g
> > +; X86-NEXT: [[CALL_LINE_3:.*]]:{{$}}
> > +; X86-NEXT: calll   _g
> > +; X86-NEXT: [[RETURN_STMT:.*]]:
> > +; X86-NEXT: ret
> > +; X86-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X86: .section        .debug$S,"rn"
> > +; X86-NEXT: .long   4
> > +; X86-NEXT: .long   242
> > +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X86-NEXT: [[F2_START]]:
> > +; X86-NEXT: .secrel32 _f
> > +; X86-NEXT: .secidx _f
> > +; X86-NEXT: .long [[END_OF_F]]-_f
> > +; Segment for file 'D:\\one.c' begins
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   1
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[CALL_LINE_1]]-_f
> > +; X86-NEXT: .long   1
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; Segment for file 'D:\\two.c' begins
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   8
> > +; X86-NEXT: .long   1
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[CALL_LINE_2]]-_f
> > +; X86-NEXT: .long   2
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; A new segment for file 'D:\\one.c' begins
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   2
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[CALL_LINE_3]]-_f
> > +; X86-NEXT: .long   7
> > +; X86-NEXT: .long [[RETURN_STMT]]-_f
> > +; X86-NEXT: .long   8
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; X86-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X86-NEXT: .long   244
> > +; X86-NEXT: .long   16
> > +; X86-NEXT: .long   1
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   10
> > +; X86-NEXT: .long   0
> > +; String table
> > +; X86-NEXT: .long   243
> > +; X86-NEXT: .long   19
> > +; X86-NEXT: .byte   0
> > +; X86-NEXT: .ascii  "D:\\one.c"
> > +; X86-NEXT: .byte   0
> > +; X86-NEXT: .ascii  "D:\\two.c"
> > +; X86-NEXT: .byte   0
> > +; X86-NEXT: .zero   1
> > +
> > +; OBJ32:    Section {
> > +; OBJ32:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ32:      Characteristics [ (0x42100040)
> > +; OBJ32:      ]
> > +; OBJ32:      Relocations [
> > +; OBJ32-NEXT:   0xC IMAGE_REL_I386_SECREL _f
> > +; OBJ32-NEXT:   0x10 IMAGE_REL_I386_SECTION _f
> > +; OBJ32-NEXT: ]
> > +; OBJ32:      FunctionLineTable [
> > +; OBJ32-NEXT:   Name: _f
> > +; OBJ32-NEXT:   CodeSize: 0x10
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\one.c
> > +; OBJ32-NEXT:     +0x0: 1
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\two.c
> > +; OBJ32-NEXT:     +0x5: 2
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\one.c
> > +; OBJ32-NEXT:     +0xA: 7
> > +; OBJ32-NEXT:     +0xF: 8
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT: ]
> > +; OBJ32:    }
> > +
> > +; X64: f:
> > +; X64-NEXT: [[START:.*]]:{{$}}
> > +; X64-NEXT: # BB
> > +; X64-NEXT: subq    $40, %rsp
> > +; X64-NEXT: [[CALL_LINE_1:.*]]:{{$}}
> > +; X64-NEXT: callq   g
> > +; X64-NEXT: [[CALL_LINE_2:.*]]:{{$}}
> > +; X64-NEXT: callq   g
> > +; X64-NEXT: [[CALL_LINE_3:.*]]:{{$}}
> > +; X64-NEXT: callq   g
> > +; X64-NEXT: [[EPILOG_AND_RET:.*]]:
> > +; X64-NEXT: addq    $40, %rsp
> > +; X64-NEXT: ret
> > +; X64-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X64: .section        .debug$S,"rn"
> > +; X64-NEXT: .long   4
> > +; X64-NEXT: .long   242
> > +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X64-NEXT: [[F2_START]]:
> > +; X64-NEXT: .secrel32 f
> > +; X64-NEXT: .secidx f
> > +; X64-NEXT: .long [[END_OF_F]]-f
> > +; Segment for file 'D:\\input.c' begins
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[START]]-f
> > +; X64-NEXT: .long   3
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; Segment for file 'D:\\one.c' begins
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   8
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[CALL_LINE_1]]-f
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; Segment for file 'D:\\two.c' begins
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   16
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[CALL_LINE_2]]-f
> > +; X64-NEXT: .long   2
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; A new segment for file 'D:\\one.c' begins
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   8
> > +; X64-NEXT: .long   2
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[CALL_LINE_3]]-f
> > +; X64-NEXT: .long   7
> > +; X64-NEXT: .long [[EPILOG_AND_RET]]-f
> > +; X64-NEXT: .long   8
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; X64-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X64-NEXT: .long   244
> > +; X64-NEXT: .long   24
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   12
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   21
> > +; X64-NEXT: .long   0
> > +; String table
> > +; X64-NEXT: .long   243
> > +; X64-NEXT: .long   30
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .ascii  "D:\\input.c"
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .ascii  "D:\\one.c"
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .ascii  "D:\\two.c"
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .zero   2
> > +
> > +; OBJ64:    Section {
> > +; OBJ64:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ64:      Characteristics [ (0x42100040)
> > +; OBJ64:      ]
> > +; OBJ64:      Relocations [
> > +; OBJ64-NEXT:   0xC IMAGE_REL_AMD64_SECREL f
> > +; OBJ64-NEXT:   0x10 IMAGE_REL_AMD64_SECTION f
> > +; OBJ64-NEXT: ]
> > +; OBJ64:      FunctionLineTable [
> > +; OBJ64-NEXT:   Name: f
> > +; OBJ64-NEXT:   CodeSize: 0x18
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\input.c
> > +; OBJ64-NEXT:     +0x0: 3
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\one.c
> > +; OBJ64-NEXT:     +0x4: 1
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\two.c
> > +; OBJ64-NEXT:     +0x9: 2
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\one.c
> > +; OBJ64-NEXT:     +0xE: 7
> > +; OBJ64-NEXT:     +0x13: 8
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT: ]
> > +; OBJ64:    }
> > +
> > +; Function Attrs: nounwind
> > +define void @f() #0 {
> > +entry:
> > +  call void @g(), !dbg !12
> > +  call void @g(), !dbg !15
> > +  call void @g(), !dbg !18
> > +  ret void, !dbg !19
> > +}
> > +
> > +declare void @g() #1
> > +
> > +attributes #0 = { nounwind "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +attributes #1 = { "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +
> > +!llvm.dbg.cu = !{!0}
> > +!llvm.module.flags = !{!9, !10}
> > +!llvm.ident = !{!11}
> > +
> > +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !2, metadata !2, metadata !""} ; [
> DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99]
> > +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"}
> > +!2 = metadata !{i32 0}
> > +!3 = metadata !{metadata !4}
> > +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f",
> metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0,
> i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32
> 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f]
> > +!5 = metadata !{metadata !"input.c", metadata !"D:\5C"}
> > +!6 = metadata !{i32 786473, metadata !5}          ; [ DW_TAG_file_type
> ] [D:\/input.c]
> > +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> > +!8 = metadata !{null}
> > +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> > +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> > +!11 = metadata !{metadata !"clang version 3.5 "}
> > +!12 = metadata !{i32 1, i32 0, metadata !13, null}
> > +!13 = metadata !{i32 786443, metadata !14, metadata !4} ; [
> DW_TAG_lexical_block ] [D:\/one.c]
> > +!14 = metadata !{metadata !"one.c", metadata !"D:\5C"}
> > +!15 = metadata !{i32 2, i32 0, metadata !16, null}
> > +!16 = metadata !{i32 786443, metadata !17, metadata !4} ; [
> DW_TAG_lexical_block ] [D:\/two.c]
> > +!17 = metadata !{metadata !"two.c", metadata !"D:\5C"}
> > +!18 = metadata !{i32 7, i32 0, metadata !13, null}
> > +!19 = metadata !{i32 8, i32 0, metadata !13, null} ; [
> DW_TAG_imported_declaration ]
> >
> > Added: llvm/trunk/test/DebugInfo/COFF/multifunction.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/multifunction.ll?rev=200440&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/multifunction.ll (added)
> > +++ llvm/trunk/test/DebugInfo/COFF/multifunction.ll Wed Jan 29 19:39:17
> 2014
> > @@ -0,0 +1,378 @@
> > +; RUN: llc -mtriple=i686-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X86 %s
> > +; RUN: llc -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ32 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X64 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ64 %s
> > +
> > +; This LL file was generated by running clang on the following code:
> > +; D:\source.c:
> > +;  1 void z(void);
> > +;  2
> > +;  3 void x(void) {
> > +;  4   z();
> > +;  5 }
> > +;  6
> > +;  7 void y(void) {
> > +;  8   z();
> > +;  9 }
> > +; 10
> > +; 11 void f(void) {
> > +; 12   x();
> > +; 13   y();
> > +; 14   z();
> > +; 15 }
> > +
> > +
> > +; X86: _x:
> > +; X86-NEXT: # BB
> > +; X86-NEXT: [[X_CALL:.*]]:{{$}}
> > +; X86-NEXT: calll   _z
> > +; X86-NEXT: [[X_RETURN:.*]]:
> > +; X86-NEXT: ret
> > +; X86-NEXT: [[END_OF_X:.*]]:
> > +;
> > +; X86: _y:
> > +; X86-NEXT: # BB
> > +; X86-NEXT: [[Y_CALL:.*]]:{{$}}
> > +; X86-NEXT: calll   _z
> > +; X86-NEXT: [[Y_RETURN:.*]]:
> > +; X86-NEXT: ret
> > +; X86-NEXT: [[END_OF_Y:.*]]:
> > +;
> > +; X86: _f:
> > +; X86-NEXT: # BB
> > +; X86-NEXT: [[F_CALLS_X:.*]]:{{$}}
> > +; X86-NEXT: calll   _x
> > +; X86-NEXT: [[F_CALLS_Y:.*]]:
> > +; X86-NEXT: calll   _y
> > +; X86-NEXT: [[F_CALLS_Z:.*]]:
> > +; X86-NEXT: calll   _z
> > +; X86-NEXT: [[F_RETURN:.*]]:
> > +; X86-NEXT: ret
> > +; X86-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X86: .section        .debug$S,"rn"
> > +; X86-NEXT: .long   4
> > +; Line table subsection for x
> > +; X86-NEXT: .long   242
> > +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X86-NEXT: [[F2_START]]:
> > +; X86-NEXT: .secrel32       _x
> > +; X86-NEXT: .secidx _x
> > +; X86-NEXT: .long [[END_OF_X]]-_x
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   2
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[X_CALL]]-_x
> > +; X86-NEXT: .long   4
> > +; X86-NEXT: .long [[X_RETURN]]-_x
> > +; X86-NEXT: .long   5
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; X86-NEXT: [[F2_END]]:
> > +; Line table subsection for y
> > +; X86-NEXT: .long   242
> > +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X86-NEXT: [[F2_START]]:
> > +; X86-NEXT: .secrel32       _y
> > +; X86-NEXT: .secidx _y
> > +; X86-NEXT: .long [[END_OF_Y]]-_y
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   2
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[Y_CALL]]-_y
> > +; X86-NEXT: .long   8
> > +; X86-NEXT: .long [[Y_RETURN]]-_y
> > +; X86-NEXT: .long   9
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; X86-NEXT: [[F2_END]]:
> > +; Line table subsection for f
> > +; X86-NEXT: .long   242
> > +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X86-NEXT: [[F2_START]]:
> > +; X86-NEXT: .secrel32 _f
> > +; X86-NEXT: .secidx _f
> > +; X86-NEXT: .long [[END_OF_F]]-_f
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   4
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[F_CALLS_X]]-_f
> > +; X86-NEXT: .long   12
> > +; X86-NEXT: .long [[F_CALLS_Y]]-_f
> > +; X86-NEXT: .long   13
> > +; X86-NEXT: .long [[F_CALLS_Z]]-_f
> > +; X86-NEXT: .long   14
> > +; X86-NEXT: .long [[F_RETURN]]-_f
> > +; X86-NEXT: .long   15
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; X86-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X86-NEXT: .long   244
> > +; X86-NEXT: .long   8
> > +; X86-NEXT: .long   1
> > +; X86-NEXT: .long   0
> > +; String table
> > +; X86-NEXT: .long   243
> > +; X86-NEXT: .long   13
> > +; X86-NEXT: .byte   0
> > +; X86-NEXT: .ascii  "D:\\source.c"
> > +; X86-NEXT: .byte   0
> > +; X86-NEXT: .zero   3
> > +
> > +; OBJ32:    Section {
> > +; OBJ32:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ32:      Characteristics [ (0x42100040)
> > +; OBJ32:      ]
> > +; OBJ32:      Relocations [
> > +; OBJ32-NEXT:   0xC IMAGE_REL_I386_SECREL _x
> > +; OBJ32-NEXT:   0x10 IMAGE_REL_I386_SECTION _x
> > +; OBJ32-NEXT:   0x3C IMAGE_REL_I386_SECREL _y
> > +; OBJ32-NEXT:   0x40 IMAGE_REL_I386_SECTION _y
> > +; OBJ32-NEXT:   0x6C IMAGE_REL_I386_SECREL _f
> > +; OBJ32-NEXT:   0x70 IMAGE_REL_I386_SECTION _f
> > +; OBJ32-NEXT: ]
> > +; OBJ32:      FunctionLineTable [
> > +; OBJ32-NEXT:   Name: _x
> > +; OBJ32-NEXT:   CodeSize: 0x6
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\source.c
> > +; OBJ32-NEXT:     +0x0: 4
> > +; OBJ32-NEXT:     +0x5: 5
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT: ]
> > +; OBJ32-NEXT: FunctionLineTable [
> > +; OBJ32-NEXT:   Name: _y
> > +; OBJ32-NEXT:   CodeSize: 0x6
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\source.c
> > +; OBJ32-NEXT:     +0x0: 8
> > +; OBJ32-NEXT:     +0x5: 9
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT: ]
> > +; OBJ32-NEXT: FunctionLineTable [
> > +; OBJ32-NEXT:   Name: _f
> > +; OBJ32-NEXT:   CodeSize: 0x10
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\source.c
> > +; OBJ32-NEXT:     +0x0: 12
> > +; OBJ32-NEXT:     +0x5: 13
> > +; OBJ32-NEXT:     +0xA: 14
> > +; OBJ32-NEXT:     +0xF: 15
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT: ]
> > +; OBJ32:    }
> > +
> > +; X64: x:
> > +; X64-NEXT: [[X_START:.*]]:{{$}}
> > +; X64-NEXT: # BB
> > +; X64-NEXT: subq    $40, %rsp
> > +; X64-NEXT: [[X_CALL_LINE:.*]]:{{$}}
> > +; X64-NEXT: callq   z
> > +; X64-NEXT: [[X_EPILOG_AND_RET:.*]]:
> > +; X64-NEXT: addq    $40, %rsp
> > +; X64-NEXT: ret
> > +; X64-NEXT: [[END_OF_X:.*]]:
> > +;
> > +; X64: y:
> > +; X64-NEXT: [[Y_START:.*]]:{{$}}
> > +; X64-NEXT: # BB
> > +; X64-NEXT: subq    $40, %rsp
> > +; X64-NEXT: [[Y_CALL_LINE:.*]]:{{$}}
> > +; X64-NEXT: callq   z
> > +; X64-NEXT: [[Y_EPILOG_AND_RET:.*]]:
> > +; X64-NEXT: addq    $40, %rsp
> > +; X64-NEXT: ret
> > +; X64-NEXT: [[END_OF_Y:.*]]:
> > +;
> > +; X64: f:
> > +; X64-NEXT: [[F_START:.*]]:{{$}}
> > +; X64-NEXT: # BB
> > +; X64-NEXT: subq    $40, %rsp
> > +; X64-NEXT: [[F_CALLS_X:.*]]:{{$}}
> > +; X64-NEXT: callq   x
> > +; X64-NEXT: [[F_CALLS_Y:.*]]:
> > +; X64-NEXT: callq   y
> > +; X64-NEXT: [[F_CALLS_Z:.*]]:
> > +; X64-NEXT: callq   z
> > +; X64-NEXT: [[F_EPILOG_AND_RET:.*]]:
> > +; X64-NEXT: addq    $40, %rsp
> > +; X64-NEXT: ret
> > +; X64-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X64: .section        .debug$S,"rn"
> > +; X64-NEXT: .long   4
> > +; Line table subsection for x
> > +; X64-NEXT: .long   242
> > +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X64-NEXT: [[F2_START]]:
> > +; X64-NEXT: .secrel32 x
> > +; X64-NEXT: .secidx x
> > +; X64-NEXT: .long [[END_OF_X]]-x
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   3
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[X_START]]-x
> > +; X64-NEXT: .long   3
> > +; X64-NEXT: .long [[X_CALL_LINE]]-x
> > +; X64-NEXT: .long   4
> > +; X64-NEXT: .long [[X_EPILOG_AND_RET]]-x
> > +; X64-NEXT: .long   5
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; X64-NEXT: [[F2_END]]:
> > +; Line table subsection for y
> > +; X64-NEXT: .long   242
> > +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X64-NEXT: [[F2_START]]:
> > +; X64-NEXT: .secrel32 y
> > +; X64-NEXT: .secidx y
> > +; X64-NEXT: .long [[END_OF_Y]]-y
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   3
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[Y_START]]-y
> > +; X64-NEXT: .long   7
> > +; X64-NEXT: .long [[Y_CALL_LINE]]-y
> > +; X64-NEXT: .long   8
> > +; X64-NEXT: .long [[Y_EPILOG_AND_RET]]-y
> > +; X64-NEXT: .long   9
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; X64-NEXT: [[F2_END]]:
> > +; Line table subsection for f
> > +; X64-NEXT: .long   242
> > +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X64-NEXT: [[F2_START]]:
> > +; X64-NEXT: .secrel32 f
> > +; X64-NEXT: .secidx f
> > +; X64-NEXT: .long [[END_OF_F]]-f
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   5
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[F_START]]-f
> > +; X64-NEXT: .long   11
> > +; X64-NEXT: .long [[F_CALLS_X]]-f
> > +; X64-NEXT: .long   12
> > +; X64-NEXT: .long [[F_CALLS_Y]]-f
> > +; X64-NEXT: .long   13
> > +; X64-NEXT: .long [[F_CALLS_Z]]-f
> > +; X64-NEXT: .long   14
> > +; X64-NEXT: .long [[F_EPILOG_AND_RET]]-f
> > +; X64-NEXT: .long   15
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; X64-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X64-NEXT: .long   244
> > +; X64-NEXT: .long   8
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: .long   0
> > +; String table
> > +; X64-NEXT: .long   243
> > +; X64-NEXT: .long   13
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .ascii  "D:\\source.c"
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .zero   3
> > +
> > +; OBJ64:    Section {
> > +; OBJ64:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ64:      Characteristics [ (0x42100040)
> > +; OBJ64:      ]
> > +; OBJ64:      Relocations [
> > +; OBJ64-NEXT:   0xC IMAGE_REL_AMD64_SECREL x
> > +; OBJ64-NEXT:   0x10 IMAGE_REL_AMD64_SECTION x
> > +; OBJ64-NEXT:   0x44 IMAGE_REL_AMD64_SECREL y
> > +; OBJ64-NEXT:   0x48 IMAGE_REL_AMD64_SECTION y
> > +; OBJ64-NEXT:   0x7C IMAGE_REL_AMD64_SECREL f
> > +; OBJ64-NEXT:   0x80 IMAGE_REL_AMD64_SECTION f
> > +; OBJ64-NEXT: ]
> > +; OBJ64:      FunctionLineTable [
> > +; OBJ64-NEXT:   Name: x
> > +; OBJ64-NEXT:   CodeSize: 0xE
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\source.c
> > +; OBJ64-NEXT:     +0x0: 3
> > +; OBJ64-NEXT:     +0x4: 4
> > +; OBJ64-NEXT:     +0x9: 5
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT: ]
> > +; OBJ64-NEXT: FunctionLineTable [
> > +; OBJ64-NEXT:   Name: y
> > +; OBJ64-NEXT:   CodeSize: 0xE
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\source.c
> > +; OBJ64-NEXT:     +0x0: 7
> > +; OBJ64-NEXT:     +0x4: 8
> > +; OBJ64-NEXT:     +0x9: 9
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT: ]
> > +; OBJ64-NEXT: FunctionLineTable [
> > +; OBJ64-NEXT:   Name: f
> > +; OBJ64-NEXT:   CodeSize: 0x18
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\source.c
> > +; OBJ64-NEXT:     +0x0: 11
> > +; OBJ64-NEXT:     +0x4: 12
> > +; OBJ64-NEXT:     +0x9: 13
> > +; OBJ64-NEXT:     +0xE: 14
> > +; OBJ64-NEXT:     +0x13: 15
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT: ]
> > +; OBJ64:    }
> > +
> > +; Function Attrs: nounwind
> > +define void @x() #0 {
> > +entry:
> > +  call void @z(), !dbg !14
> > +  ret void, !dbg !15
> > +}
> > +
> > +declare void @z() #1
> > +
> > +; Function Attrs: nounwind
> > +define void @y() #0 {
> > +entry:
> > +  call void @z(), !dbg !16
> > +  ret void, !dbg !17
> > +}
> > +
> > +; Function Attrs: nounwind
> > +define void @f() #0 {
> > +entry:
> > +  call void @x(), !dbg !18
> > +  call void @y(), !dbg !19
> > +  call void @z(), !dbg !20
> > +  ret void, !dbg !21
> > +}
> > +
> > +attributes #0 = { nounwind "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +attributes #1 = { "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +
> > +!llvm.dbg.cu = !{!0}
> > +!llvm.module.flags = !{!11, !12}
> > +!llvm.ident = !{!13}
> > +
> > +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !2, metadata !2, metadata !""} ; [
> DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99]
> > +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"}
> > +!2 = metadata !{i32 0}
> > +!3 = metadata !{metadata !4, metadata !9, metadata !10}
> > +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"x",
> metadata !"x", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0,
> i32 0, null, i32 256, i1 false, void ()* @x, null, null, metadata !2, i32
> 3} ; [ DW_TAG_subprogram ] [line 3] [def] [x]
> > +!5 = metadata !{metadata !"source.c", metadata !"D:\5C"}
> > +!6 = metadata !{i32 786473, metadata !5}          ; [ DW_TAG_file_type
> ] [D:\/source.c]
> > +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> > +!8 = metadata !{null}
> > +!9 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"y",
> metadata !"y", metadata !"", i32 7, metadata !7, i1 false, i1 true, i32 0,
> i32 0, null, i32 256, i1 false, void ()* @y, null, null, metadata !2, i32
> 7} ; [ DW_TAG_subprogram ] [line 7] [def] [y]
> > +!10 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f",
> metadata !"f", metadata !"", i32 11, metadata !7, i1 false, i1 true, i32 0,
> i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32
> 11} ; [ DW_TAG_subprogram ] [line 11] [def] [f]
> > +!11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> > +!12 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> > +!13 = metadata !{metadata !"clang version 3.5 "}
> > +!14 = metadata !{i32 4, i32 0, metadata !4, null}
> > +!15 = metadata !{i32 5, i32 0, metadata !4, null}
> > +!16 = metadata !{i32 8, i32 0, metadata !9, null} ; [
> DW_TAG_imported_declaration ]
> > +!17 = metadata !{i32 9, i32 0, metadata !9, null}
> > +!18 = metadata !{i32 12, i32 0, metadata !10, null}
> > +!19 = metadata !{i32 13, i32 0, metadata !10, null}
> > +!20 = metadata !{i32 14, i32 0, metadata !10, null}
> > +!21 = metadata !{i32 15, i32 0, metadata !10, null}
> >
> > Added: llvm/trunk/test/DebugInfo/COFF/simple.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/simple.ll?rev=200440&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/simple.ll (added)
> > +++ llvm/trunk/test/DebugInfo/COFF/simple.ll Wed Jan 29 19:39:17 2014
> > @@ -0,0 +1,167 @@
> > +; RUN: llc -mtriple=i686-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X86 %s
> > +; RUN: llc -mtriple=i686-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=i686-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ32 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -O0 < %s | FileCheck
> --check-prefix=X64 %s
> > +; RUN: llc -mtriple=x86_64-pc-win32 -o - -O0 < %s | llvm-mc
> -triple=x86_64-pc-win32 -filetype=obj | llvm-readobj -s -sr
> -codeview-linetables | FileCheck --check-prefix=OBJ64 %s
> > +
> > +; This LL file was generated by running clang on the following code:
> > +; D:\test.c:
> > +; 1 void g(void);
> > +; 2
> > +; 3 void f(void) {
> > +; 4   g();
> > +; 5 }
> > +
> > +; X86: _f:
> > +; X86-NEXT: # BB
> > +; X86-NEXT: [[CALL_LINE:^L.*]]:{{$}}
> > +; X86-NEXT: calll   _g
> > +; X86-NEXT: [[RETURN_STMT:.*]]:
> > +; X86-NEXT: ret
> > +; X86-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X86: .section        .debug$S,"rn"
> > +; X86-NEXT: .long   4
> > +; X86-NEXT: .long   242
> > +; X86-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X86-NEXT: [[F2_START]]:
> > +; X86-NEXT: .secrel32 _f
> > +; X86-NEXT: .secidx _f
> > +; X86-NEXT: .long [[END_OF_F]]-_f
> > +; X86-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X86-NEXT: .long   0
> > +; X86-NEXT: .long   2
> > +; X86-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X86-NEXT: .long [[CALL_LINE]]-_f
> > +; X86-NEXT: .long   4
> > +; X86-NEXT: .long [[RETURN_STMT]]-_f
> > +; X86-NEXT: .long   5
> > +; X86-NEXT: [[FILE_SEGMENT_END]]:
> > +; X86-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X86-NEXT: .long   244
> > +; X86-NEXT: .long   8
> > +; X86-NEXT: .long   1
> > +; X86-NEXT: .long   0
> > +; String table
> > +; X86-NEXT: .long   243
> > +; X86-NEXT: .long   11
> > +; X86-NEXT: .byte   0
> > +; X86-NEXT: .ascii  "D:\\test.c"
> > +; X86-NEXT: .byte   0
> > +; Padding
> > +; X86-NEXT: .zero   1
> > +
> > +; OBJ32:    Section {
> > +; OBJ32:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ32:      Characteristics [ (0x42100040)
> > +; OBJ32:      ]
> > +; OBJ32:      Relocations [
> > +; OBJ32-NEXT:   0xC IMAGE_REL_I386_SECREL _f
> > +; OBJ32-NEXT:   0x10 IMAGE_REL_I386_SECTION _f
> > +; OBJ32-NEXT: ]
> > +; OBJ32:      FunctionLineTable [
> > +; OBJ32-NEXT:   Name: _f
> > +; OBJ32-NEXT:   CodeSize: 0x6
> > +; OBJ32-NEXT:   FilenameSegment [
> > +; OBJ32-NEXT:     Filename: D:\test.c
> > +; OBJ32-NEXT:     +0x0: 4
> > +; OBJ32-NEXT:     +0x5: 5
> > +; OBJ32-NEXT:   ]
> > +; OBJ32-NEXT: ]
> > +; OBJ32:    }
> > +
> > +; X64: f:
> > +; X64-NEXT: [[START:.*]]:{{$}}
> > +; X64-NEXT: # BB
> > +; X64-NEXT: subq    $40, %rsp
> > +; X64-NEXT: [[CALL_LINE:.*]]:{{$}}
> > +; X64-NEXT: callq   g
> > +; X64-NEXT: [[EPILOG_AND_RET:.*]]:
> > +; X64-NEXT: addq    $40, %rsp
> > +; X64-NEXT: ret
> > +; X64-NEXT: [[END_OF_F:.*]]:
> > +;
> > +; X64: .section        .debug$S,"rn"
> > +; X64-NEXT: .long   4
> > +; X64-NEXT: .long   242
> > +; X64-NEXT: .long [[F2_END:.*]]-[[F2_START:.*]]
> > +; X64-NEXT: [[F2_START]]:
> > +; X64-NEXT: .secrel32 f
> > +; X64-NEXT: .secidx f
> > +; X64-NEXT: .long [[END_OF_F]]-f
> > +; X64-NEXT: [[FILE_SEGMENT_START:[^:]*]]:
> > +; X64-NEXT: .long   0
> > +; X64-NEXT: .long   3
> > +; X64-NEXT: .long [[FILE_SEGMENT_END:.*]]-[[FILE_SEGMENT_START]]
> > +; X64-NEXT: .long [[START]]-f
> > +; X64-NEXT: .long   3
> > +; X64-NEXT: .long [[CALL_LINE]]-f
> > +; X64-NEXT: .long   4
> > +; X64-NEXT: .long [[EPILOG_AND_RET]]-f
> > +; X64-NEXT: .long   5
> > +; X64-NEXT: [[FILE_SEGMENT_END]]:
> > +; X64-NEXT: [[F2_END]]:
> > +; File index to string table offset subsection
> > +; X64-NEXT: .long   244
> > +; X64-NEXT: .long   8
> > +; X64-NEXT: .long   1
> > +; X64-NEXT: .long   0
> > +; String table
> > +; X64-NEXT: .long   243
> > +; X64-NEXT: .long   11
> > +; X64-NEXT: .byte   0
> > +; X64-NEXT: .ascii  "D:\\test.c"
> > +; X64-NEXT: .byte   0
> > +; Padding
> > +; X64-NEXT: .zero   1
> > +
> > +; OBJ64:    Section {
> > +; OBJ64:      Name: .debug$S (2E 64 65 62 75 67 24 53)
> > +; OBJ64:      Characteristics [ (0x42100040)
> > +; OBJ64:      ]
> > +; OBJ64:      Relocations [
> > +; OBJ64-NEXT:   0xC IMAGE_REL_AMD64_SECREL f
> > +; OBJ64-NEXT:   0x10 IMAGE_REL_AMD64_SECTION f
> > +; OBJ64-NEXT: ]
> > +; OBJ64:      FunctionLineTable [
> > +; OBJ64-NEXT:   Name: f
> > +; OBJ64-NEXT:   CodeSize: 0xE
> > +; OBJ64-NEXT:   FilenameSegment [
> > +; OBJ64-NEXT:     Filename: D:\test.c
> > +; OBJ64-NEXT:     +0x0: 3
> > +; OBJ64-NEXT:     +0x4: 4
> > +; OBJ64-NEXT:     +0x9: 5
> > +; OBJ64-NEXT:   ]
> > +; OBJ64-NEXT: ]
> > +; OBJ64:    }
> > +
> > +; Function Attrs: nounwind
> > +define void @f() #0 {
> > +entry:
> > +  call void @g(), !dbg !12
> > +  ret void, !dbg !13
> > +}
> > +
> > +declare void @g() #1
> > +
> > +attributes #0 = { nounwind "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +attributes #1 = { "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="false" "no-infs-fp-math"="false"
> "no-nans-fp-math"="false" "no-realign-stack"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +
> > +!llvm.dbg.cu = !{!0}
> > +!llvm.module.flags = !{!9, !10}
> > +!llvm.ident = !{!11}
> > +
> > +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !2, metadata !2, metadata !""} ; [
> DW_TAG_compile_unit ] [D:\/<unknown>] [DW_LANG_C99]
> > +!1 = metadata !{metadata !"<unknown>", metadata !"D:\5C"}
> > +!2 = metadata !{i32 0}
> > +!3 = metadata !{metadata !4}
> > +!4 = metadata !{i32 786478, metadata !5, metadata !6, metadata !"f",
> metadata !"f", metadata !"", i32 3, metadata !7, i1 false, i1 true, i32 0,
> i32 0, null, i32 256, i1 false, void ()* @f, null, null, metadata !2, i32
> 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f]
> > +!5 = metadata !{metadata !"test.c", metadata !"D:\5C"}
> > +!6 = metadata !{i32 786473, metadata !5}          ; [ DW_TAG_file_type
> ] [D:\/test.c]
> > +!7 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> > +!8 = metadata !{null}
> > +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
> > +!10 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> > +!11 = metadata !{metadata !"clang version 3.5 "}
> > +!12 = metadata !{i32 4, i32 0, metadata !4, null}
> > +!13 = metadata !{i32 5, i32 0, metadata !4, null}
> >
> > Added: llvm/trunk/test/DebugInfo/X86/coff_debug_info_type.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/coff_debug_info_type.ll?rev=200440&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/X86/coff_debug_info_type.ll (added)
> > +++ llvm/trunk/test/DebugInfo/X86/coff_debug_info_type.ll Wed Jan 29
> 19:39:17 2014
> > @@ -0,0 +1,39 @@
> > +; RUN: llc -mtriple=i686-pc-mingw32 -filetype=asm -O0 < %s | FileCheck
> %s
> > +; RUN: llc -mtriple=i686-pc-cygwin -filetype=asm -O0 < %s | FileCheck %s
> > +; RUN: llc -mtriple=i686-w64-mingw32 -filetype=asm -O0 < %s | FileCheck
> %s
> > +; CHECK:    .section  .debug_info
> > +
> > +; RUN: llc -mtriple=i686-pc-win32 -filetype=asm -O0 < %s | FileCheck
> -check-prefix=WIN32 %s
> > +; WIN32:    .section .debug$S,"rn"
> > +
> > +; generated from:
> > +; clang -g -S -emit-llvm test.c -o test.ll
> > +; int main()
> > +; {
> > +;      return 0;
> > +; }
> > +
> > +define i32 @main() #0 {
> > +entry:
> > +  %retval = alloca i32, align 4
> > +  store i32 0, i32* %retval
> > +  ret i32 0, !dbg !10
> > +}
> > +
> > +attributes #0 = { nounwind "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true"
> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> > +
> > +!llvm.dbg.cu = !{!0}
> > +!llvm.module.flags = !{!9, !11}
> > +
> > +!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang
> version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2,
> metadata !3, metadata !2, metadata !2, metadata !""} ; [
> DW_TAG_compile_unit ] [C:\Projects/test.c] [DW_LANG_C99]
> > +!1 = metadata !{metadata !"test.c", metadata !"C:\5CProjects"}
> > +!2 = metadata !{i32 0}
> > +!3 = metadata !{metadata !4}
> > +!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main",
> metadata !"main", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32
> 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2,
> i32 2} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 2] [main]
> > +!5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type
> ] [C:\Projects/test.c]
> > +!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0,
> i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> > +!7 = metadata !{metadata !8}
> > +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32,
> i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32,
> align 32, offset 0, enc DW_ATE_signed]
> > +!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 3}
> > +!10 = metadata !{i32 3, i32 0, metadata !4, null}
> > +!11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
> >
> > Modified: llvm/trunk/test/DebugInfo/X86/coff_relative_names.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/coff_relative_names.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/X86/coff_relative_names.ll (original)
> > +++ llvm/trunk/test/DebugInfo/X86/coff_relative_names.ll Wed Jan 29
> 19:39:17 2014
> > @@ -10,10 +10,6 @@
> >  ;      return 0;
> >  ; }
> >
> > -; ModuleID = 'test.c'
> > -target datalayout =
> "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"
> > -target triple = "i686-pc-win32"
> > -
> >  ; Function Attrs: nounwind
> >  define i32 @main() #0 {
> >  entry:
> >
> > Modified: llvm/trunk/test/DebugInfo/X86/dbg-byval-parameter.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dbg-byval-parameter.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/X86/dbg-byval-parameter.ll (original)
> > +++ llvm/trunk/test/DebugInfo/X86/dbg-byval-parameter.ll Wed Jan 29
> 19:39:17 2014
> > @@ -1,4 +1,4 @@
> > -; RUN: llc -march=x86 -asm-verbose < %s | grep DW_TAG_formal_parameter
> > +; RUN: %llc_dwarf -march=x86 -asm-verbose < %s | grep
> DW_TAG_formal_parameter
> >
> >
> >  %struct.Pt = type { double, double }
> >
> > Modified: llvm/trunk/test/DebugInfo/array.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/array.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/array.ll (original)
> > +++ llvm/trunk/test/DebugInfo/array.ll Wed Jan 29 19:39:17 2014
> > @@ -1,4 +1,4 @@
> > -; RUN: llc -O0 < %s | FileCheck %s
> > +; RUN: %llc_dwarf -O0 < %s | FileCheck %s
> >  ; Do not emit AT_upper_bound for an unbounded array.
> >  ; radar 9241695
> >  define i32 @main() nounwind ssp {
> >
> > Modified: llvm/trunk/test/DebugInfo/cu-ranges.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/cu-ranges.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/cu-ranges.ll (original)
> > +++ llvm/trunk/test/DebugInfo/cu-ranges.ll Wed Jan 29 19:39:17 2014
> > @@ -1,5 +1,5 @@
> >  ; REQUIRES: object-emission
> > -; RUN: llc -O0 -filetype=obj -generate-dwarf-cu-ranges %s -o %t
> > +; RUN: %llc_dwarf -O0 -filetype=obj -generate-dwarf-cu-ranges %s -o %t
> >  ; RUN: llvm-dwarfdump %t | FileCheck %s
> >
> >  ; Check that we emit ranges for this when the -generate-dwarf-cu-ranges
> flag is passed.
> >
> > Modified: llvm/trunk/test/DebugInfo/debug-info-qualifiers.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/debug-info-qualifiers.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/debug-info-qualifiers.ll (original)
> > +++ llvm/trunk/test/DebugInfo/debug-info-qualifiers.ll Wed Jan 29
> 19:39:17 2014
> > @@ -14,7 +14,7 @@
> >  ;   auto pr = &A::r;
> >  ; }
> >  ;
> > -; RUN: llc -filetype=obj -O0 < %s | llvm-dwarfdump - | FileCheck %s
> > +; RUN: %llc_dwarf -filetype=obj -O0 < %s | llvm-dwarfdump - | FileCheck
> %s
> >  ; CHECK: DW_TAG_subroutine_type     DW_CHILDREN_yes
> >  ; CHECK-NEXT: DW_AT_reference  DW_FORM_flag_present
> >  ; CHECK: DW_TAG_subroutine_type     DW_CHILDREN_yes
> >
> > Modified: llvm/trunk/test/DebugInfo/dwarf-public-names.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/dwarf-public-names.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/dwarf-public-names.ll (original)
> > +++ llvm/trunk/test/DebugInfo/dwarf-public-names.ll Wed Jan 29 19:39:17
> 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -generate-dwarf-pub-sections=Enable -filetype=obj -o %t.o <
> %s
> > +; RUN: %llc_dwarf -generate-dwarf-pub-sections=Enable -filetype=obj -o
> %t.o < %s
> >  ; RUN: llvm-dwarfdump -debug-dump=pubnames %t.o | FileCheck %s
> >  ; ModuleID = 'dwarf-public-names.cpp'
> >  ;
> >
> > Modified: llvm/trunk/test/DebugInfo/enum.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/enum.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/enum.ll (original)
> > +++ llvm/trunk/test/DebugInfo/enum.ll Wed Jan 29 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -O0 -filetype=obj < %s > %t
> > +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
> >  ; RUN: llvm-dwarfdump %t | FileCheck %s
> >
> >  ; IR generated from the following code compiled with clang -g:
> >
> > Modified: llvm/trunk/test/DebugInfo/global.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/global.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/global.ll (original)
> > +++ llvm/trunk/test/DebugInfo/global.ll Wed Jan 29 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -O0 -filetype=obj < %s > %t
> > +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
> >  ; RUN: llvm-dwarfdump %t | FileCheck %s
> >
> >  ; generated from the following source compiled to bitcode with clang -g
> -O1
> >
> > Modified: llvm/trunk/test/DebugInfo/inlined-arguments.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/inlined-arguments.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/inlined-arguments.ll (original)
> > +++ llvm/trunk/test/DebugInfo/inlined-arguments.ll Wed Jan 29 19:39:17
> 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -filetype=obj < %s > %t
> > +; RUN: %llc_dwarf -filetype=obj < %s > %t
> >  ; RUN: llvm-dwarfdump %t | FileCheck %s
> >
> >  ; IR generated from clang -O -g with the following source
> >
> > Modified: llvm/trunk/test/DebugInfo/inlined-vars.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/inlined-vars.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/inlined-vars.ll (original)
> > +++ llvm/trunk/test/DebugInfo/inlined-vars.ll Wed Jan 29 19:39:17 2014
> > @@ -1,5 +1,5 @@
> > -; RUN: llc -O0 < %s | FileCheck %s -check-prefix ARGUMENT
> > -; RUN: llc -O0 < %s | FileCheck %s -check-prefix VARIABLE
> > +; RUN: %llc_dwarf -O0 < %s | FileCheck %s -check-prefix ARGUMENT
> > +; RUN: %llc_dwarf -O0 < %s | FileCheck %s -check-prefix VARIABLE
> >  ; PR 13202
> >
> >  define i32 @main() uwtable {
> >
> > Modified: llvm/trunk/test/DebugInfo/member-order.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/member-order.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/member-order.ll (original)
> > +++ llvm/trunk/test/DebugInfo/member-order.ll Wed Jan 29 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -filetype=obj -O0 < %s | llvm-dwarfdump -debug-dump=info - |
> FileCheck %s
> > +; RUN: %llc_dwarf -filetype=obj -O0 < %s | llvm-dwarfdump
> -debug-dump=info - | FileCheck %s
> >
> >  ; generated by clang from:
> >  ; struct foo {
> >
> > Modified: llvm/trunk/test/DebugInfo/member-pointers.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/member-pointers.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/member-pointers.ll (original)
> > +++ llvm/trunk/test/DebugInfo/member-pointers.ll Wed Jan 29 19:39:17 2014
> > @@ -1,7 +1,7 @@
> >  ; REQUIRES: object-emission
> >  ; XFAIL: hexagon
> >
> > -; RUN: llc -filetype=obj -O0 < %s > %t
> > +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t
> >  ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
> >  ; CHECK: DW_TAG_ptr_to_member_type
> >  ; CHECK: DW_TAG_ptr_to_member_type
> >
> > Modified: llvm/trunk/test/DebugInfo/namespace.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/namespace.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/namespace.ll (original)
> > +++ llvm/trunk/test/DebugInfo/namespace.ll Wed Jan 29 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -O0 -filetype=obj < %s > %t
> > +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
> >  ; RUN: llvm-dwarfdump %t | FileCheck %s
> >  ; CHECK: debug_info contents
> >  ; CHECK: [[NS1:0x[0-9a-f]*]]:{{ *}}DW_TAG_namespace
> >
> > Modified: llvm/trunk/test/DebugInfo/template-recursive-void.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/template-recursive-void.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/template-recursive-void.ll (original)
> > +++ llvm/trunk/test/DebugInfo/template-recursive-void.ll Wed Jan 29
> 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -O0 -filetype=obj < %s > %t
> > +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
> >  ; RUN: llvm-dwarfdump %t | FileCheck %s
> >
> >  ; This was pulled from clang's debug-info-template-recursive.cpp test.
> >
> > Modified: llvm/trunk/test/DebugInfo/tu-composite.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/tu-composite.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/tu-composite.ll (original)
> > +++ llvm/trunk/test/DebugInfo/tu-composite.ll Wed Jan 29 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -filetype=obj -O0 < %s > %t
> > +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t
> >  ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
> >  ; CHECK: [[TYPE:.*]]: DW_TAG_structure_type
> >  ; Make sure we correctly handle containing type of a struct being a
> type identifier.
> >
> > Modified: llvm/trunk/test/DebugInfo/tu-member-pointer.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/tu-member-pointer.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/tu-member-pointer.ll (original)
> > +++ llvm/trunk/test/DebugInfo/tu-member-pointer.ll Wed Jan 29 19:39:17
> 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -filetype=obj -O0 < %s > %t
> > +; RUN: %llc_dwarf -filetype=obj -O0 < %s > %t
> >  ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
> >  ; CHECK: DW_TAG_ptr_to_member_type
> >  ; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]       (cu + {{.*}} =>
> {[[TYPE:0x[0-9a-f]+]]})
> >
> > Modified: llvm/trunk/test/DebugInfo/two-cus-from-same-file.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/two-cus-from-same-file.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/two-cus-from-same-file.ll (original)
> > +++ llvm/trunk/test/DebugInfo/two-cus-from-same-file.ll Wed Jan 29
> 19:39:17 2014
> > @@ -5,7 +5,7 @@
> >
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc %s -o %t -filetype=obj -O0
> > +; RUN: %llc_dwarf %s -o %t -filetype=obj -O0
> >  ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
> >
> >  ; ModuleID = 'test.bc'
> >
> > Modified: llvm/trunk/test/DebugInfo/version.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/version.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/version.ll (original)
> > +++ llvm/trunk/test/DebugInfo/version.ll Wed Jan 29 19:39:17 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >
> > -; RUN: llc -O0 -filetype=obj < %s > %t
> > +; RUN: %llc_dwarf -O0 -filetype=obj < %s > %t
> >  ; RUN: llvm-dwarfdump %t | FileCheck %s
> >
> >  ; Make sure we are generating DWARF version 3 when module flag says so.
> >
> > Modified: llvm/trunk/test/Linker/type-unique-simple-a.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/type-unique-simple-a.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/Linker/type-unique-simple-a.ll (original)
> > +++ llvm/trunk/test/Linker/type-unique-simple-a.ll Wed Jan 29 19:39:17
> 2014
> > @@ -2,7 +2,7 @@
> >
> >  ; RUN: llvm-link %s %p/type-unique-simple-b.ll -S -o %t
> >  ; RUN: cat %t | FileCheck %s -check-prefix=LINK
> > -; RUN: llc -filetype=obj -O0 < %t > %t2
> > +; RUN: %llc_dwarf -filetype=obj -O0 < %t > %t2
> >  ; RUN: llvm-dwarfdump -debug-dump=info %t2 | FileCheck %s
> >
> >  ; Make sure the backend generates a single DIE and uses ref_addr.
> >
> > Modified: llvm/trunk/test/Linker/type-unique-simple2-a.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/type-unique-simple2-a.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/Linker/type-unique-simple2-a.ll (original)
> > +++ llvm/trunk/test/Linker/type-unique-simple2-a.ll Wed Jan 29 19:39:17
> 2014
> > @@ -1,6 +1,6 @@
> >  ; REQUIRES: object-emission
> >  ;
> > -; RUN: llvm-link %s %p/type-unique-simple2-b.ll -S -o - | llc
> -filetype=obj -O0 | llvm-dwarfdump -debug-dump=info - | FileCheck %s
> > +; RUN: llvm-link %s %p/type-unique-simple2-b.ll -S -o - | %llc_dwarf
> -filetype=obj -O0 | llvm-dwarfdump -debug-dump=info - | FileCheck %s
> >  ;
> >  ; Tests for a merge error where attributes are inserted twice into the
> same DIE.
> >  ;
> >
> > Modified: llvm/trunk/test/Linker/type-unique-simple2.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/type-unique-simple2.ll?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/Linker/type-unique-simple2.ll (original)
> > +++ llvm/trunk/test/Linker/type-unique-simple2.ll Wed Jan 29 19:39:17
> 2014
> > @@ -2,5 +2,5 @@
> >
> >  ; RUN: llvm-link %S/Inputs/type-unique-simple2-a.ll
> %S/Inputs/type-unique-simple2-b.ll -S -o %t
> >  ; RUN: cat %t | FileCheck %S/Inputs/type-unique-simple2-a.ll
> -check-prefix=LINK
> > -; RUN: llc -filetype=obj -O0 < %t > %t2
> > +; RUN: %llc_dwarf -filetype=obj -O0 < %t > %t2
> >  ; RUN: llvm-dwarfdump -debug-dump=info %t2 | FileCheck
> %S/Inputs/type-unique-simple2-a.ll
> >
> > Modified: llvm/trunk/test/lit.cfg
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/lit.cfg?rev=200440&r1=200439&r2=200440&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/lit.cfg (original)
> > +++ llvm/trunk/test/lit.cfg Wed Jan 29 19:39:17 2014
> > @@ -156,6 +156,12 @@ if re.search(r'cygwin|mingw32|win32', co
> >    lli_mcjit += ' -mtriple='+config.host_triple+'-elf'
> >  config.substitutions.append( ('%lli_mcjit', lli_mcjit) )
> >
> > +# Similarly, have a macro to use llc with DWARF even when the host is
> win32.
> > +llc_dwarf = 'llc'
> > +if re.search(r'win32', config.target_triple):
> > +  llc_dwarf += ' -mtriple='+config.target_triple.replace('-win32',
> '-mingw32')
> > +config.substitutions.append( ('%llc_dwarf', llc_dwarf) )
> > +
> >  # Provide a substition for those tests that need to run the jit to
> obtain data
> >  # but simply want use the currently considered most reliable jit for
> platform
> >  # FIXME: ppc32 is not ready for mcjit.
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140130/cde9b6a5/attachment.html>


More information about the llvm-commits mailing list