LDFileFormat.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//===- LDFileFormat.h -----------------------------------------------------===//
223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//
323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//                     The MCLinker Project
423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//
523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// This file is distributed under the University of Illinois Open Source
623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck// License. See LICENSE.TXT for details.
723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//
823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck//===----------------------------------------------------------------------===//
923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifndef MCLD_LDFILE_FORMAT_H
1023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#define MCLD_LDFILE_FORMAT_H
1123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#ifdef ENABLE_UNITTEST
1223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <gtest.h>
1323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif
1423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
1523b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <cstdio>
1623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#include <cassert>
1723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
1823b797ab5151eb2474f3bdd679f2f07bfd723042John Recknamespace mcld {
1923b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
20998a6d81896df8b662cc10ddeb35087b78b38d72John Reckclass LDSection;
21998a6d81896df8b662cc10ddeb35087b78b38d72John Reckclass ObjectBuilder;
2223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
2323b797ab5151eb2474f3bdd679f2f07bfd723042John Reck/** \class LDFileFormat
2419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck *  \brief LDFileFormat describes the common file formats.
254f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck */
2619b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reckclass LDFileFormat
274f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck{
28e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reckpublic:
29fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck  enum Kind {
30119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    Null,
31860d155f866cc15a725e7ce03763280987f24901John Reck    Regular,
324f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    BSS,
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    NamePool,
344f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    Relocation,
354f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    Debug,
3623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    Target,
3723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    EhFrame,
3823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    EhFrameHdr,
394f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    GCCExceptTable,
40119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck    Version,
4119b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    Note,
424f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    MetaData,
434f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    Group,
441949e7928eeec22cd3f74b5f763a4eb433238453John Reck    StackNote,
454f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck    Ignore
4623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  };
4723b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
483b20251a355c88193c439f928a84ae69483fb488John Reckprotected:
494f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck  LDFileFormat();
5023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
5123b797ab5151eb2474f3bdd679f2f07bfd723042John Reckpublic:
52119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck  virtual ~LDFileFormat();
53e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
5423b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  /// initStdSections - initialize all standard section headers.
55119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck  /// @param [in] pBuilder The ObjectBuilder to create section headers
56119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck  /// @param [in] pBitClass The bitclass of target backend.
57e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck  virtual void initStdSections(ObjectBuilder& pBuilder,
5823b797ab5151eb2474f3bdd679f2f07bfd723042John Reck                               unsigned int pBitClass) = 0;
59a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck
60a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck  // -----  access functions  ----- //
61a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck  LDSection& getText() {
62058fc640017c90120c599d378a4cbc55668b05b7Chris Craik    assert(NULL != f_pTextSection);
63058fc640017c90120c599d378a4cbc55668b05b7Chris Craik    return *f_pTextSection;
6463a06673253914510bbeebd500655008682dade1John Reck  }
65860d155f866cc15a725e7ce03763280987f24901John Reck
6668bfe0a37a0dcef52abd81688d8520c5d16e1a85John Reck  const LDSection& getText() const {
67d72e0a339b54af0c4e731513bbad120dff694723John Reck    assert(NULL != f_pTextSection);
68e4267ea4f20740c37c01bfb6aefcf61fddc4566aJohn Reck    return *f_pTextSection;
69fae904d63947fe1687d1d44be29234cc3d538f24John Reck  }
7023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
71e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck  LDSection& getData() {
7218f16e6fba74eda173e1e7c869e6e2e2acc073ffJohn Reck    assert(NULL != f_pDataSection);
73e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    return *f_pDataSection;
743e8249568cc428296ac76c7ddce3f0382d40fe5bJohn Reck  }
7519b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck
76998a6d81896df8b662cc10ddeb35087b78b38d72John Reck  const LDSection& getData() const {
7719b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck    assert(NULL != f_pDataSection);
78f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck    return *f_pDataSection;
79f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck  }
80e1628b7c6fc3822fa83cf02028ce8ad67abb0afeJohn Reck
813b20251a355c88193c439f928a84ae69483fb488John Reck  LDSection& getBSS() {
8223b797ab5151eb2474f3bdd679f2f07bfd723042John Reck    assert(NULL != f_pBSSSection);
83fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck    return *f_pBSSSection;
84fc53ef27793a39e9effd829e9cae02a9ca14147eJohn Reck  }
851949e7928eeec22cd3f74b5f763a4eb433238453John Reck
861949e7928eeec22cd3f74b5f763a4eb433238453John Reck  const LDSection& getBSS() const {
871949e7928eeec22cd3f74b5f763a4eb433238453John Reck    assert(NULL != f_pBSSSection);
883b20251a355c88193c439f928a84ae69483fb488John Reck    return *f_pBSSSection;
893b20251a355c88193c439f928a84ae69483fb488John Reck  }
9066f0be65a1046f54ddce0498b242c1fa0776b1eaJohn Reck
91f47a594f5250b1914c36423ee6b371f0b8db09d0John Reck  LDSection& getReadOnly() {
92a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    assert(NULL != f_pReadOnlySection);
93a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    return *f_pReadOnlySection;
94fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck  }
95fe5e7b7346a54537b980796ceeca66bfdbd05561John Reck
9623b797ab5151eb2474f3bdd679f2f07bfd723042John Reck  const LDSection& getReadOnly() const {
97a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    assert(NULL != f_pReadOnlySection);
98a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck    return *f_pReadOnlySection;
99a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck  }
1004f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reckprotected:
101f7d9c1dc84671d4e99657ef071d275700d85bb11John Reck  //         variable name         :  ELF               MachO
1024f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck  LDSection* f_pTextSection;       // .text             __text
10319b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck  LDSection* f_pDataSection;       // .data             __data
10419b6bcfd83eb7fb92ebd06d2fec89e308311f1d0John Reck  LDSection* f_pBSSSection;        // .bss              __bss
105998a6d81896df8b662cc10ddeb35087b78b38d72John Reck  LDSection* f_pReadOnlySection;   // .rodata           __const
106998a6d81896df8b662cc10ddeb35087b78b38d72John Reck};
1074f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck
1083b20251a355c88193c439f928a84ae69483fb488John Reck} // namespace of mcld
109a5dda645da738da7b4ae15e28fa7d93d3b04b94fJohn Reck
11023b797ab5151eb2474f3bdd679f2f07bfd723042John Reck#endif
11123b797ab5151eb2474f3bdd679f2f07bfd723042John Reck
1124f02bf4eef6af47f35c70c4dda5b7b9523d89ca0John Reck