| 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);
 | 
|  };
 | 
|  
 | 
| 
 |