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

Unified Diff: courgette/assembly_program.h

Issue 2793153003: [Courgette] Refactor: Store Label Annotation in AssemblyProgram for patch generation. (Closed)
Patch Set: Rename *_label_annotation to *_label_annotations. Created 3 years, 8 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/adjustment_method_unittest.cc ('k') | courgette/assembly_program.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: courgette/assembly_program.h
diff --git a/courgette/assembly_program.h b/courgette/assembly_program.h
index 9eb693e25d30974925d5f7ef99914b344875abea..3fd1c99b17ccde465c7138ddf7ce6fabea0b625c 100644
--- a/courgette/assembly_program.h
+++ b/courgette/assembly_program.h
@@ -8,8 +8,8 @@
#include <stddef.h>
#include <stdint.h>
-#include <map>
#include <memory>
+#include <vector>
#include "base/callback_forward.h"
#include "base/macros.h"
@@ -78,12 +78,23 @@ class Instruction {
class AssemblyProgram {
public:
using LabelHandler = base::Callback<void(Label*)>;
- using LabelHandlerMap = std::map<OP, LabelHandler>;
AssemblyProgram(ExecutableType kind, uint64_t image_base);
~AssemblyProgram();
ExecutableType kind() const { return kind_; }
+ const std::vector<Label*>& abs32_label_annotations() const {
+ return abs32_label_annotations_;
+ }
+ const std::vector<Label*>& rel32_label_annotations() const {
+ return rel32_label_annotations_;
+ }
+ std::vector<Label*>* mutable_abs32_label_annotations() {
+ return &abs32_label_annotations_;
+ }
+ std::vector<Label*>* mutable_rel32_label_annotations() {
+ return &rel32_label_annotations_;
+ }
// Traverses RVAs in |abs32_visitor| and |rel32_visitor| to precompute Labels.
void PrecomputeLabels(RvaVisitor* abs32_visitor, RvaVisitor* rel32_visitor);
@@ -102,18 +113,15 @@ class AssemblyProgram {
// Looks up rel32 label. Returns null if none found.
Label* FindRel32Label(RVA rva);
- std::unique_ptr<EncodedProgram> Encode() const;
-
- // For each |instruction| in |instructions_|, looks up its opcode from
- // |handler_map| for a handler. If a handler exists, invoke it by passing the
- // |instruction|'s label. We assume that |handler_map| has correct keys, i.e.,
- // opcodes for an instruction that have label.
- void HandleInstructionLabels(const LabelHandlerMap& handler_map) const;
-
// Calls |gen| in 2 passes to emit instructions. In pass 1 we provide a
// receptor to count space requirement. In pass 2 we provide a receptor to
- // store instructions.
- CheckBool GenerateInstructions(const InstructionGenerator& gen);
+ // store instructions. If |annotate_labels| is true, then extracts Label
+ // annotations into |*_label_annotations_|.
+ CheckBool GenerateInstructions(const InstructionGenerator& gen,
+ bool annotate_labels);
+
+ // Returns an EncodeProgram that converts program to encoded form.
+ std::unique_ptr<EncodedProgram> Encode() const;
// TODO(huangs): Implement these in InstructionStoreReceptor.
// Instructions will be assembled in the order they are emitted.
@@ -181,6 +189,11 @@ class AssemblyProgram {
LabelManager abs32_label_manager_;
LabelManager rel32_label_manager_;
+ // Label pointers for each abs32 and rel32 location, sorted by file offset.
+ // These are used by Label adjustment during patch generation.
+ std::vector<Label*> abs32_label_annotations_;
+ std::vector<Label*> rel32_label_annotations_;
+
DISALLOW_COPY_AND_ASSIGN(AssemblyProgram);
};
« no previous file with comments | « courgette/adjustment_method_unittest.cc ('k') | courgette/assembly_program.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698