[PECOFF] Add COFF relocations to encode/decode to/from YAML files

llvm-svn: 193478
diff --git a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
index 8aacf3a..065a2c0 100644
--- a/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
@@ -172,13 +172,35 @@
 
 Writer &PECOFFLinkingContext::writer() const { return *_writer; }
 
+#define LLD_CASE(name) .Case(#name, llvm::COFF::name)
+
 ErrorOr<Reference::Kind>
 PECOFFLinkingContext::relocKindFromString(StringRef str) const {
-  return make_error_code(YamlReaderError::illegal_value);
+  int32_t ret = llvm::StringSwitch<int32_t>(str)
+        LLD_CASE(IMAGE_REL_I386_ABSOLUTE)
+        LLD_CASE(IMAGE_REL_I386_DIR32)
+        LLD_CASE(IMAGE_REL_I386_DIR32NB)
+        LLD_CASE(IMAGE_REL_I386_REL32)
+        .Default(-1);
+  if (ret == -1)
+    return make_error_code(YamlReaderError::illegal_value);
+  return ret;
 }
 
+#undef LLD_CASE
+
+#define LLD_CASE(name)                                                         \
+  case llvm::COFF::name:                                                        \
+  return std::string(#name);
+
 ErrorOr<std::string>
 PECOFFLinkingContext::stringFromRelocKind(Reference::Kind kind) const {
+  switch (kind) {
+    LLD_CASE(IMAGE_REL_I386_ABSOLUTE)
+    LLD_CASE(IMAGE_REL_I386_DIR32)
+    LLD_CASE(IMAGE_REL_I386_DIR32NB)
+    LLD_CASE(IMAGE_REL_I386_REL32)
+  }
   return make_error_code(YamlReaderError::illegal_value);
 }