122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- FragmentLinker.h ---------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file provides a number of APIs used by SectLinker.
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// These APIs do the things which a linker should do.
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_FRAGMENT_FRAGMENT_LINKER_H
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_FRAGMENT_FRAGMENT_LINKER_H
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <string>
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h>
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/LDFileFormat.h>
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/LDSymbol.h>
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/Relocation.h>
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/MC/MCLDInput.h>
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module;
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetLDBackend;
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig;
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MemoryArea;
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class FragmentLinker
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief FragmentLinker provides a pass to link object files.
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass FragmentLinker
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FragmentLinker(const LinkerConfig& pConfig,
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                 Module& pModule,
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                 TargetLDBackend& pBackend);
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~FragmentLinker();
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool finalizeSymbols();
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// applyRelocations - apply all relocation enties.
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool applyRelocations();
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// syncRelocationResult - After applying relocation, write back relocation target
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// data to output file.
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void syncRelocationResult(MemoryArea& pOutput);
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// normalSyncRelocationResult - sync relocation result when producing shared
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// objects or executables
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void normalSyncRelocationResult(MemoryArea& pOutput);
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// partialSyncRelocationResult - sync relocation result when doing partial
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// link
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void partialSyncRelocationResult(MemoryArea& pOutput);
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// writeRelocationResult - helper function of syncRelocationResult, write
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// relocation target data to output
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void writeRelocationResult(Relocation& pReloc, uint8_t* pOutput);
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LinkerConfig& m_Config;
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Module& m_Module;
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TargetLDBackend& m_Backend;
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
79