aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Linker.h
blob: 2e548116d0953bca4ad789093bd0d79376d0e075 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//===- llvm/Linker.h - Module Linker Interface ------------------*- C++ -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by Reid Spencer and is distributed under the 
// University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
// This file defines the interface to the module/file/archive linker.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LINKER_H
#define LLVM_LINKER_H

#include <string>
#include <vector>
#include <set>

namespace llvm {

class Module;

/// This is the heart of the linker. The \p Src module is linked into the \p
/// Dest module. If an error occurs, true is returned, otherwise false. If \p
/// ErrorMsg is not null and an error occurs, \p *ErrorMsg will be set to a
/// readable string that indicates the nature of the error.  Note that this can
/// destroy the Src module in arbitrary ways.
///
/// @returns true if there's an error
/// @brief Link two modules together
bool LinkModules(
  Module* Dest,          ///< Module into which \p Src is linked
  Module* Src,     ///< Module linked into \p Dest
  std::string* ErrorMsg  ///< Optional error message string
);

/// This function links the bytecode \p Files into the \p HeadModule. Note that
/// this does not do any linking of unresolved symbols. The \p Files are all
/// completely linked into \p HeadModule regardless of unresolved symbols. This
/// function just loads each bytecode file and calls LinkModules on them. 
/// @returns true if an error occurs, false otherwise
bool LinkFiles (
  const char * progname, ///< Name of the program being linked (for output)
  Module * HeadModule,   ///< Main (resulting) module to be linked into
  const std::vector<std::string> & Files, ///< Files to link in
  bool Verbose ///< Link verbosely, indicating each action
);

/// This function links one archive, \p Filename,  that contains bytecode into
/// \p HeadModule.  If an error occurs, true is returned, otherwise false. If
/// \p ErrorMsg is not null and an error occurs, \p *ErrorMsg will be set to a
/// readable string that indicates the nature of the error.
/// @returns true if there's an error
/// @brief Link in one archive.
bool LinkInArchive( 
  Module* HeadModule,          ///< Main (resulting) module to be linked into
  const std::string& Filename, ///< Filename of the archive to link
  std::string* ErrorMsg,       ///< Error message if an error occurs.
  bool Verbose                 ///< Link verbosely, indicating each action
);

/// This function provides the ability to handle the -L and -l options on a 
/// linker's command line. It will link into \p HeadModule any modules found in
/// the \p Libraries (which might be found in the \p LibPaths). 
/// @brief Link libraries into a module
void LinkLibraries (
  const char * progname,   ///< Name of the program being linked (for output)
  Module* HeadModule,      ///< Main (resulting) module to be linked into
  const std::vector<std::string> & Libraries, ///< Set of libraries to link in
  const std::vector<std::string> & LibPaths,  ///< Set of library paths
  bool Verbose, ///< Link verbosely, indicating each action
  bool Native ///< Linking is for a native executable
);

/// This function looks at Module \p M and returns a set of strings, 
/// \p DefinedSymbols, that is the publicly visible defined symbols in 
/// module \p M.
void GetAllDefinedSymbols (Module *M, std::set<std::string> &DefinedSymbols);

/// This function looks at Module \p M and returns a set of strings, 
/// \p UnefinedSymbols, that is the publicly visible undefined symbols in 
/// module \p M.
void GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols);

/// This function looks through a set of \p Paths to find a library with the
/// name \p Filename. If \p SharedObjectOnly is true, it only finds a match
/// if the file is a shared library.
std::string FindLib(const std::string &Filename,
                    const std::vector<std::string> &Paths,
                    bool SharedObjectOnly = false);
  
} // End llvm namespace

#endif