Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Unified Diff: courgette/encoded_program_unittest.cc

Issue 1935203002: [Courgette] Using LabelManager to reduce Courgette-apply peak RAM by 25%. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sync. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « courgette/encoded_program.cc ('k') | courgette/image_utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: courgette/encoded_program_unittest.cc
diff --git a/courgette/encoded_program_unittest.cc b/courgette/encoded_program_unittest.cc
index 52f8d88679ecd2ac8db4ff0cc3ae0c44f937f3ab..e8e461481c1447998aaea1fee7f54a8176d7fa92 100644
--- a/courgette/encoded_program_unittest.cc
+++ b/courgette/encoded_program_unittest.cc
@@ -21,55 +21,32 @@ namespace courgette {
namespace {
// Helper class to instantiate RVAToLabel while managing allocation.
-class RVAToLabelMaker {
+class TestLabelManager : public LabelManager {
public:
- RVAToLabelMaker() {}
- ~RVAToLabelMaker() {}
-
- // Adds a Label for storage. Must be called before Make(), since |labels_map_|
- // has pointers into |labels_|, and |labels_.push_back()| can invalidate them.
- void Add(int index, RVA rva) {
- DCHECK(label_map_.empty());
+ void RawAddLabel(int index, RVA rva) {
labels_.push_back(Label(rva, index)); // Don't care about |count_|.
}
-
- // Initializes |label_map_| and returns a pointer to it.
- RVAToLabel* Make() {
- for (size_t i = 0; i < labels_.size(); ++i) {
- DCHECK_EQ(0U, label_map_.count(labels_[i].rva_));
- label_map_[labels_[i].rva_] = &labels_[i];
- }
- return &label_map_;
- }
-
- const std::vector<Label>& GetLabels() const { return labels_; }
-
- private:
- std::vector<Label> labels_; // Stores all Labels.
- RVAToLabel label_map_; // Has pointers to |labels_| elements.
};
// Creates a simple new program with given addresses. The orders of elements
// in |abs32_specs| and |rel32_specs| are important.
std::unique_ptr<EncodedProgram> CreateTestProgram(
- RVAToLabelMaker* abs32_maker,
- RVAToLabelMaker* rel32_maker) {
- RVAToLabel* abs32_labels = abs32_maker->Make();
- RVAToLabel* rel32_labels = rel32_maker->Make();
-
+ const TestLabelManager& abs32_label_manager,
+ const TestLabelManager& rel32_label_manager) {
std::unique_ptr<EncodedProgram> program(new EncodedProgram());
uint32_t base = 0x00900000;
program->set_image_base(base);
- EXPECT_TRUE(program->DefineLabels(*abs32_labels, *rel32_labels));
+ EXPECT_TRUE(program->ImportLabels(abs32_label_manager, rel32_label_manager));
EXPECT_TRUE(program->AddOrigin(0)); // Start at base.
- // Arbitrary: Add instructions in the order they're defined in |*_maker|.
- for (const Label& label : abs32_maker->GetLabels())
+ // Add instructions. Since we're using TestLabelManager, Labels are sorted in
+ // the order they're added via Add().
+ for (const Label& label : abs32_label_manager.Labels())
EXPECT_TRUE(program->AddAbs32(label.index_));
- for (const Label& label : rel32_maker->GetLabels())
+ for (const Label& label : rel32_label_manager.Labels())
EXPECT_TRUE(program->AddRel32(label.index_));
return program;
@@ -91,14 +68,14 @@ bool CompareSink(const uint8_t expected[],
// check that the bits produced are as expected.
TEST(EncodedProgramTest, Test) {
// ABS32 index 7 <-- base + 4.
- RVAToLabelMaker abs32_label_maker;
- abs32_label_maker.Add(7, 4);
+ TestLabelManager abs32_label_manager;
+ abs32_label_manager.RawAddLabel(7, 4);
// REL32 index 5 <-- base + 0.
- RVAToLabelMaker rel32_label_maker;
- rel32_label_maker.Add(5, 0);
+ TestLabelManager rel32_label_manager;
+ rel32_label_manager.RawAddLabel(5, 0);
std::unique_ptr<EncodedProgram> program(
- CreateTestProgram(&abs32_label_maker, &rel32_label_maker));
+ CreateTestProgram(abs32_label_manager, rel32_label_manager));
// Serialize and deserialize.
SinkStreamSet sinks;
@@ -139,18 +116,18 @@ TEST(EncodedProgramTest, Test) {
// contents of the address streams.
TEST(EncodedProgramTest, TestWriteAddress) {
// Absolute addresses by index: [_, _, _, 2, _, 23, _, 11].
- RVAToLabelMaker abs32_label_maker;
- abs32_label_maker.Add(7, 11);
- abs32_label_maker.Add(3, 2);
- abs32_label_maker.Add(5, 23);
+ TestLabelManager abs32_label_manager;
+ abs32_label_manager.RawAddLabel(7, 11);
+ abs32_label_manager.RawAddLabel(3, 2);
+ abs32_label_manager.RawAddLabel(5, 23);
// Relative addresses by index: [16, 7, _, 32].
- RVAToLabelMaker rel32_label_maker;
- rel32_label_maker.Add(0, 16);
- rel32_label_maker.Add(3, 32);
- rel32_label_maker.Add(1, 7);
+ TestLabelManager rel32_label_manager;
+ rel32_label_manager.RawAddLabel(0, 16);
+ rel32_label_manager.RawAddLabel(3, 32);
+ rel32_label_manager.RawAddLabel(1, 7);
std::unique_ptr<EncodedProgram> program(
- CreateTestProgram(&abs32_label_maker, &rel32_label_maker));
+ CreateTestProgram(abs32_label_manager, rel32_label_manager));
SinkStreamSet sinks;
EXPECT_TRUE(program->WriteTo(&sinks));
« no previous file with comments | « courgette/encoded_program.cc ('k') | courgette/image_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698