aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lld/MachO/Dwarf.cpp')
-rw-r--r--lld/MachO/Dwarf.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/lld/MachO/Dwarf.cpp b/lld/MachO/Dwarf.cpp
new file mode 100644
index 000000000000..121f54fb1f79
--- /dev/null
+++ b/lld/MachO/Dwarf.cpp
@@ -0,0 +1,49 @@
+//===- DWARF.cpp ----------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "Dwarf.h"
+#include "InputFiles.h"
+#include "InputSection.h"
+#include "OutputSegment.h"
+
+#include <memory>
+
+using namespace lld;
+using namespace lld::macho;
+using namespace llvm;
+
+std::unique_ptr<DwarfObject> DwarfObject::create(ObjFile *obj) {
+ auto dObj = std::make_unique<DwarfObject>();
+ bool hasDwarfInfo = false;
+ for (SubsectionMap subsecMap : obj->subsections) {
+ for (auto it : subsecMap) {
+ InputSection *isec = it.second;
+ if (!(isDebugSection(isec->flags) &&
+ isec->segname == segment_names::dwarf))
+ continue;
+
+ if (isec->name == "__debug_info") {
+ dObj->infoSection.Data = toStringRef(isec->data);
+ hasDwarfInfo = true;
+ continue;
+ }
+
+ if (StringRef *s = StringSwitch<StringRef *>(isec->name)
+ .Case("__debug_abbrev", &dObj->abbrevSection)
+ .Case("__debug_str", &dObj->strSection)
+ .Default(nullptr)) {
+ *s = toStringRef(isec->data);
+ hasDwarfInfo = true;
+ }
+ }
+ }
+
+ if (hasDwarfInfo)
+ return dObj;
+ return nullptr;
+}