119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===- MemoryObject.cpp - Abstract memory interface -----------------------===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/MemoryObject.h"
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMemoryObject::~MemoryObject() {
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanint MemoryObject::readBytes(uint64_t address,
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                            uint64_t size,
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                            uint8_t* buf,
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                            uint64_t* copied) const {
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  uint64_t current = address;
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  uint64_t limit = getBase() + getExtent();
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (current + size > limit)
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return -1;
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  while (current - address < size) {
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (readByte(current, &buf[(current - address)]))
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return -1;
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    current++;
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (copied)
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    *copied = current - address;
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return 0;
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
38