[APFloat] Fixed a bug in method 'fusedMultiplyAdd'.
[oota-llvm.git] / lib / DebugInfo / DWARFDebugLoc.cpp
index 8fe7481bbfe45faa17ff446f85b1e7a785bbf770..e4aa5dcce27e808b4429804535db25987f3089a5 100644 (file)
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Dwarf.h"
 
 using namespace llvm;
 
 void DWARFDebugLoc::dump(raw_ostream &OS) const {
-  for (LocationLists::const_iterator I = Locations.begin(), E = Locations.end(); I != E; ++I) {
-    OS << format("0x%8.8x: ", I->Offset);
+  for (const LocationList &L : Locations) {
+    OS << format("0x%8.8x: ", L.Offset);
     const unsigned Indent = 12;
-    for (SmallVectorImpl<Entry>::const_iterator I2 = I->Entries.begin(), E2 = I->Entries.end(); I2 != E2; ++I2) {
-      if (I2 != I->Entries.begin())
+    for (const Entry &E : L.Entries) {
+      if (&E != L.Entries.begin())
         OS.indent(Indent);
-      OS << "Beginning address offset: " << format("0x%016" PRIx64, I2->Begin)
+      OS << "Beginning address offset: " << format("0x%016" PRIx64, E.Begin)
          << '\n';
       OS.indent(Indent) << "   Ending address offset: "
-                        << format("0x%016" PRIx64, I2->End) << '\n';
+                        << format("0x%016" PRIx64, E.End) << '\n';
       OS.indent(Indent) << "    Location description: ";
-      for (SmallVectorImpl<unsigned char>::const_iterator I3 = I2->Loc.begin(), E3 = I2->Loc.end(); I3 != E3; ++I3) {
-        OS << format("%2.2x ", *I3);
+      for (unsigned char Loc : E.Loc) {
+        OS << format("%2.2x ", Loc);
       }
       OS << "\n\n";
     }
@@ -74,3 +75,54 @@ void DWARFDebugLoc::parse(DataExtractor data, unsigned AddressSize) {
   if (data.isValidOffset(Offset))
     llvm::errs() << "error: failed to consume entire .debug_loc section\n";
 }
+
+void DWARFDebugLocDWO::parse(DataExtractor data) {
+  uint32_t Offset = 0;
+  while (data.isValidOffset(Offset)) {
+    Locations.resize(Locations.size() + 1);
+    LocationList &Loc = Locations.back();
+    Loc.Offset = Offset;
+    dwarf::LocationListEntry Kind;
+    while ((Kind = static_cast<dwarf::LocationListEntry>(
+                data.getU8(&Offset))) != dwarf::DW_LLE_end_of_list_entry) {
+
+      if (Kind != dwarf::DW_LLE_start_length_entry) {
+        llvm::errs() << "error: dumping support for LLE of kind " << (int)Kind
+                     << " not implemented\n";
+        return;
+      }
+
+      Entry E;
+
+      E.Start = data.getULEB128(&Offset);
+      E.Length = data.getU32(&Offset);
+
+      unsigned Bytes = data.getU16(&Offset);
+      // A single location description describing the location of the object...
+      StringRef str = data.getData().substr(Offset, Bytes);
+      Offset += Bytes;
+      E.Loc.resize(str.size());
+      std::copy(str.begin(), str.end(), E.Loc.begin());
+
+      Loc.Entries.push_back(std::move(E));
+    }
+  }
+}
+
+void DWARFDebugLocDWO::dump(raw_ostream &OS) const {
+  for (const LocationList &L : Locations) {
+    OS << format("0x%8.8x: ", L.Offset);
+    const unsigned Indent = 12;
+    for (const Entry &E : L.Entries) {
+      if (&E != L.Entries.begin())
+        OS.indent(Indent);
+      OS << "Beginning address index: " << E.Start << '\n';
+      OS.indent(Indent) << "                 Length: " << E.Length << '\n';
+      OS.indent(Indent) << "   Location description: ";
+      for (unsigned char Loc : E.Loc)
+        OS << format("%2.2x ", Loc);
+      OS << "\n\n";
+    }
+  }
+}
+