| Index: src/trusted/validator_mips/address_set.h
|
| diff --git a/src/trusted/validator_mips/address_set.h b/src/trusted/validator_mips/address_set.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d36c7c8e5597bd8899d6a8dec199bc70974283f5
|
| --- /dev/null
|
| +++ b/src/trusted/validator_mips/address_set.h
|
| @@ -0,0 +1,81 @@
|
| +/*
|
| + * Copyright 2012 The Native Client Authors. All rights reserved.
|
| + * Use of this source code is governed by a BSD-style license that can
|
| + * be found in the LICENSE file.
|
| + * Copyright 2012, Google Inc.
|
| + */
|
| +
|
| +#ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_ADDRESS_SET_H
|
| +#define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_ADDRESS_SET_H
|
| +
|
| +#include <stdint.h>
|
| +
|
| +namespace nacl_mips_val {
|
| +
|
| +/*
|
| + * A set of word addresses, implemented as a dense bitset.
|
| + *
|
| + * An AddressSet has a base address and a size, in bytes, of the space to
|
| + * describe. Describing N bytes costs N/32 bytes here, since we only record
|
| + * word addresses (4-byte alignment) and pack 8 per byte.
|
| + *
|
| + * Thus, an AddressSet covering the entire 256MB code region costs 8MB, plus
|
| + * a small constant overhead (~16 bytes).
|
| + */
|
| +class AddressSet {
|
| + public:
|
| + /*
|
| + * Creates an AddressSet describing 'size' bytes starting at 'base'.
|
| + */
|
| + AddressSet(uint32_t base, uint32_t size);
|
| + ~AddressSet();
|
| +
|
| + /*
|
| + * Adds an address to the set.
|
| + * - If the address is already in the set, nothing changes.
|
| + * - If the address is outside of this set's range (delimited by base and size
|
| + * provided at construction), nothing changes.
|
| + * - If the address is not 4-byte aligned, the address of the 4-byte word
|
| + * containing the address is added instead.
|
| + */
|
| + void Add(uint32_t address);
|
| +
|
| + /*
|
| + * Checks whether the AddressSet contains an address. If the address is not
|
| + * 4-byte aligned, the address of the 4-byte word containing the address is
|
| + * checked instead.
|
| + */
|
| + bool Contains(uint32_t address) const;
|
| +
|
| + class Iterator {
|
| + public:
|
| + Iterator(const AddressSet &, uint32_t index, uint32_t shift);
|
| + Iterator& Next();
|
| + bool Equals(const Iterator &) const;
|
| + uint32_t GetAddress() const;
|
| +
|
| + private:
|
| + void Advance();
|
| +
|
| + const AddressSet &parent_;
|
| + uint32_t index_;
|
| + uint32_t shift_;
|
| + };
|
| +
|
| + Iterator Begin() const;
|
| + Iterator End() const;
|
| +
|
| + private:
|
| + const uint32_t base_;
|
| + const uint32_t size_;
|
| + const uint32_t end_;
|
| + uint32_t * const bits_;
|
| +
|
| + // Disallow copies - we don't need them, and don't want to refcount bits_.
|
| + AddressSet(const AddressSet &);
|
| + AddressSet &operator=(const AddressSet &);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +#endif // NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_ADDRESS_SET_H
|
|
|