YAML.h revision 5fd5fe0f7bfac0f7973475fcf7a5f8061d983538
15fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//===- YAML.h - YAMLIO utilities for object files ---------------*- C++ -*-===//
25fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//
35fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//                     The LLVM Compiler Infrastructure
45fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//
55fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola// This file is distributed under the University of Illinois Open Source
65fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola// License. See LICENSE.TXT for details.
75fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//
85fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//===----------------------------------------------------------------------===//
95fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//
105fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola// This file declares utility classes for handling the YAML representation of
115fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola// object files.
125fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//
135fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola//===----------------------------------------------------------------------===//
145fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
155fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola#ifndef LLVM_OBJECT_YAML_H
165fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola#define LLVM_OBJECT_YAML_H
175fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
185fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola#include "llvm/Support/YAMLTraits.h"
195fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
205fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindolanamespace llvm {
215fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindolanamespace object {
225fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindolanamespace yaml {
235fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
245fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola/// In an object file this is just a binary blob. In an yaml file it is an hex
255fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola/// string. Using this avoid having to allocate temporary strings.
265fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindolaclass BinaryRef {
275fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  ArrayRef<uint8_t> Data;
285fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  bool isBinary;
295fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
305fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindolapublic:
315fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  BinaryRef(ArrayRef<uint8_t> Data) : Data(Data), isBinary(true) {}
325fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  BinaryRef(StringRef Data)
335fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola      : Data(reinterpret_cast<const uint8_t *>(Data.data()), Data.size()),
345fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola        isBinary(false) {}
355fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  BinaryRef() : isBinary(false) {}
365fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  StringRef getHex() const {
375fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola    assert(!isBinary);
385fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola    return StringRef(reinterpret_cast<const char *>(Data.data()), Data.size());
395fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  }
405fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  ArrayRef<uint8_t> getBinary() const {
415fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola    assert(isBinary);
425fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola    return Data;
435fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  }
445fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola};
455fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
465fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola}
475fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola}
485fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
495fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindolanamespace yaml {
505fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindolatemplate <> struct ScalarTraits<object::yaml::BinaryRef> {
515fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  static void output(const object::yaml::BinaryRef &, void *,
525fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola                     llvm::raw_ostream &);
535fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola  static StringRef input(StringRef, void *, object::yaml::BinaryRef &);
545fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola};
555fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola}
565fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
575fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola}
585fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola
595fd5fe0f7bfac0f7973475fcf7a5f8061d983538Rafael Espindola#endif
60