blob: 9fe8f8f4fc7de6ce516cf8215f37b0dc0bfd08ed [file] [log] [blame]
Shih-wei Liao22add6f2012-12-15 17:21:00 -08001//===- Linker.h -----------------------------------------------------------===//
2//
3// The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Stephen Hines37b74a32014-11-26 18:48:20 -08009#ifndef MCLD_LINKER_H_
10#define MCLD_LINKER_H_
Shih-wei Liao22add6f2012-12-15 17:21:00 -080011
12#include <string>
13
14namespace mcld {
15
Shih-wei Liao22add6f2012-12-15 17:21:00 -080016class FileHandle;
Stephen Hines87f34652014-02-14 18:00:16 -080017class FileOutputBuffer;
Stephen Hines37b74a32014-11-26 18:48:20 -080018class IRBuilder;
19class LinkerConfig;
20class LinkerScript;
21class Module;
22class ObjectLinker;
23class Target;
24class TargetLDBackend;
Shih-wei Liao22add6f2012-12-15 17:21:00 -080025
26/** \class Linker
27* \brief Linker is a modular linker.
28*/
Stephen Hines37b74a32014-11-26 18:48:20 -080029class Linker {
30 public:
Shih-wei Liao22add6f2012-12-15 17:21:00 -080031 Linker();
32
33 ~Linker();
34
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070035 /// emulate - To set up target-dependent options and default linker script.
36 bool emulate(LinkerScript& pScript, LinkerConfig& pConfig);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080037
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070038 /// normalize - To normalize the command line language into mcld::Module.
39 bool normalize(Module& pModule, IRBuilder& pBuilder);
Stephen Hines6f757552013-03-04 19:51:03 -080040
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070041 /// resolve - To build up the topology of mcld::Module.
Stephen Hines87f34652014-02-14 18:00:16 -080042 bool resolve(Module& pModule);
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070043
44 /// layout - To serialize the final result of the output mcld::Module.
Stephen Hines6f757552013-03-04 19:51:03 -080045 bool layout();
46
47 /// link - A convenient way to resolve and to layout the output mcld::Module.
Shih-wei Liao22add6f2012-12-15 17:21:00 -080048 bool link(Module& pModule, IRBuilder& pBuilder);
49
Stephen Hines87f34652014-02-14 18:00:16 -080050 /// emit - To emit output mcld::Module to a FileOutputBuffer.
51 bool emit(FileOutputBuffer& pOutput);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080052
Stephen Hines6f757552013-03-04 19:51:03 -080053 /// emit - To open a file for output in pPath and to emit output mcld::Module
54 /// to the file.
Stephen Hines87f34652014-02-14 18:00:16 -080055 bool emit(const Module& pModule, const std::string& pPath);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080056
Stephen Hines6f757552013-03-04 19:51:03 -080057 /// emit - To emit output mcld::Module in the pFileDescriptor.
Stephen Hines87f34652014-02-14 18:00:16 -080058 bool emit(const Module& pModule, int pFileDescriptor);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080059
60 bool reset();
61
Stephen Hines37b74a32014-11-26 18:48:20 -080062 private:
Shih-wei Liao22add6f2012-12-15 17:21:00 -080063 bool initTarget();
64
65 bool initBackend();
66
Shih-wei Liao22add6f2012-12-15 17:21:00 -080067 bool initOStream();
68
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070069 bool initEmulator(LinkerScript& pScript);
70
Stephen Hines37b74a32014-11-26 18:48:20 -080071 private:
Shih-wei Liao22add6f2012-12-15 17:21:00 -080072 LinkerConfig* m_pConfig;
Shih-wei Liao22add6f2012-12-15 17:21:00 -080073 IRBuilder* m_pIRBuilder;
74
75 const Target* m_pTarget;
76 TargetLDBackend* m_pBackend;
77 ObjectLinker* m_pObjLinker;
78};
79
Stephen Hines37b74a32014-11-26 18:48:20 -080080} // namespace mcld
Shih-wei Liao22add6f2012-12-15 17:21:00 -080081
Stephen Hines37b74a32014-11-26 18:48:20 -080082#endif // MCLD_LINKER_H_