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