Files
sdk/runtime/vm/code_descriptors.h
T
kmillikin@google.com cc619aa2c9 Change the stackmap builder API.
It is inconvenient for the stackmap table builder to use a singleton bitmap
for all safepoints in a code object.  Instead, split the bitmap from the
table builder and allow a bitmap per safepoint.

Take this opportunity to rename StackmapBuilder => StackmapTableBuilder
because it builds the entire table of stackmaps for a code object.

R=vegorov@google.com
BUG=

Review URL: https://chromiumcodereview.appspot.com//10825077

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@10043 260f80e4-7a28-3924-810f-c04153c831b5
2012-07-31 08:32:33 +00:00

134 lines
3.5 KiB
C++

// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef VM_CODE_DESCRIPTORS_H_
#define VM_CODE_DESCRIPTORS_H_
#include "vm/globals.h"
#include "vm/growable_array.h"
#include "vm/object.h"
namespace dart {
class DescriptorList : public ZoneAllocated {
public:
struct PcDesc {
intptr_t pc_offset; // PC offset value of the descriptor.
PcDescriptors::Kind kind; // Descriptor kind (kDeopt, kOther).
intptr_t node_id; // AST node id.
intptr_t token_index; // Token position in source of PC.
intptr_t try_index; // Try block index of PC.
};
explicit DescriptorList(intptr_t initial_capacity) : list_(initial_capacity) {
}
~DescriptorList() { }
intptr_t Length() const {
return list_.length();
}
intptr_t PcOffset(int index) const {
return list_[index].pc_offset;
}
PcDescriptors::Kind Kind(int index) const {
return list_[index].kind;
}
intptr_t NodeId(int index) const {
return list_[index].node_id;
}
intptr_t TokenIndex(int index) const {
return list_[index].token_index;
}
intptr_t TryIndex(int index) const {
return list_[index].try_index;
}
void AddDescriptor(PcDescriptors::Kind kind,
intptr_t pc_offset,
intptr_t node_id,
intptr_t token_index,
intptr_t try_index);
RawPcDescriptors* FinalizePcDescriptors(uword entry_point);
private:
GrowableArray<struct PcDesc> list_;
DISALLOW_COPY_AND_ASSIGN(DescriptorList);
};
class StackmapTableBuilder : public ZoneAllocated {
public:
StackmapTableBuilder() :
stack_map_(Stackmap::ZoneHandle()),
list_(GrowableObjectArray::ZoneHandle(
GrowableObjectArray::New(Heap::kOld))) { }
~StackmapTableBuilder() { }
void AddEntry(intptr_t pc_offset, BitmapBuilder* bitmap);
bool Verify();
RawArray* FinalizeStackmaps(const Code& code);
private:
intptr_t Length() const { return list_.Length(); }
RawStackmap* Map(int index) const;
Stackmap& stack_map_;
GrowableObjectArray& list_;
DISALLOW_COPY_AND_ASSIGN(StackmapTableBuilder);
};
class ExceptionHandlerList : public ZoneAllocated {
public:
struct HandlerDesc {
intptr_t try_index; // Try block index handled by the handler.
intptr_t pc_offset; // Handler PC offset value.
};
ExceptionHandlerList() : list_() {}
intptr_t Length() const {
return list_.length();
}
intptr_t TryIndex(int index) const {
return list_[index].try_index;
}
intptr_t PcOffset(int index) const {
return list_[index].pc_offset;
}
void SetPcOffset(int index, intptr_t handler_pc) {
list_[index].pc_offset = handler_pc;
}
void AddHandler(intptr_t try_index, intptr_t pc_offset) {
struct HandlerDesc data;
data.try_index = try_index;
data.pc_offset = pc_offset;
list_.Add(data);
}
RawExceptionHandlers* FinalizeExceptionHandlers(uword entry_point) {
intptr_t num_handlers = Length();
const ExceptionHandlers& handlers =
ExceptionHandlers::Handle(ExceptionHandlers::New(num_handlers));
for (intptr_t i = 0; i < num_handlers; i++) {
handlers.SetHandlerEntry(i, TryIndex(i), (entry_point + PcOffset(i)));
}
return handlers.raw();
}
private:
GrowableArray<struct HandlerDesc> list_;
DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerList);
};
} // namespace dart
#endif // VM_CODE_DESCRIPTORS_H_