//===-- lib/CodeGen/ELFCodeEmitter.h ----------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef ELFCODEEMITTER_H
#define ELFCODEEMITTER_H

#include "llvm/CodeGen/ObjectCodeEmitter.h"
#include <vector>

namespace llvm {
  class ELFWriter;
  class ELFSection;

  /// ELFCodeEmitter - This class is used by the ELFWriter to 
  /// emit the code for functions to the ELF file.
  class ELFCodeEmitter : public ObjectCodeEmitter {
    ELFWriter &EW;

    /// Target machine description
    TargetMachine &TM;

    /// Section containing code for functions
    ELFSection *ES;

    /// Relocations - Record relocations needed by the current function 
    std::vector<MachineRelocation> Relocations;

    /// JTRelocations - Record relocations needed by the relocation
    /// section.
    std::vector<MachineRelocation> JTRelocations;

    /// FnStartPtr - Function offset from the beginning of ELFSection 'ES'
    uintptr_t FnStartOff;
  public:
    explicit ELFCodeEmitter(ELFWriter &ew) : EW(ew), TM(EW.TM) {}

    /// addRelocation - Register new relocations for this function
    void addRelocation(const MachineRelocation &MR) {
      Relocations.push_back(MR);
    }

    /// emitConstantPool - For each constant pool entry, figure out which
    /// section the constant should live in and emit data to it
    void emitConstantPool(MachineConstantPool *MCP);

    /// emitJumpTables - Emit all the jump tables for a given jump table
    /// info and record them to the appropriate section.
    void emitJumpTables(MachineJumpTableInfo *MJTI);

    void startFunction(MachineFunction &F);
    bool finishFunction(MachineFunction &F);

    /// emitLabel - Emits a label
    virtual void emitLabel(MCSymbol *Label) {
      assert(0 && "emitLabel not implemented");
    }

    /// getLabelAddress - Return the address of the specified LabelID, 
    /// only usable after the LabelID has been emitted.
    virtual uintptr_t getLabelAddress(MCSymbol *Label) const {
      assert(0 && "getLabelAddress not implemented");
      return 0;
    }

    virtual void setModuleInfo(llvm::MachineModuleInfo* MMI) {}

};  // end class ELFCodeEmitter

} // end namespace llvm

#endif

