blob: 7f475d40aa0a88edf6aeaf241a52e8e0069fc899 [file] [log] [blame]
Nick Kledzik6d886992008-02-26 20:26:43 +00001//===-LTOModule.h - LLVM Link Time Optimizer ------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the LTOModule class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LTO_MODULE_H
15#define LTO_MODULE_H
16
17#include "llvm/Module.h"
Nick Kledzik79d0a052008-02-27 22:25:36 +000018#include "llvm/ADT/OwningPtr.h"
Nick Kledzik6d886992008-02-26 20:26:43 +000019#include "llvm/Target/TargetMachine.h"
20#include "llvm/ADT/StringMap.h"
21
22#include "llvm-c/lto.h"
23
24#include <vector>
Nick Kledzik79d0a052008-02-27 22:25:36 +000025#include <string>
26
27
28// forward references to llvm classes
29namespace llvm {
30 class Mangler;
31 class MemoryBuffer;
32 class GlobalValue;
33 class Value;
34 class Function;
35}
Nick Kledzik6d886992008-02-26 20:26:43 +000036
37
38//
39// C++ class which implements the opaque lto_module_t
40//
Douglas Gregor4c13f092009-12-23 17:05:07 +000041struct LTOModule {
Nick Kledzik6d886992008-02-26 20:26:43 +000042
43 static bool isBitcodeFile(const void* mem, size_t length);
44 static bool isBitcodeFile(const char* path);
45
46 static bool isBitcodeFileForTarget(const void* mem,
47 size_t length, const char* triplePrefix);
48
49 static bool isBitcodeFileForTarget(const char* path,
50 const char* triplePrefix);
51
Owen Anderson25209b42009-07-01 16:58:40 +000052 static LTOModule* makeLTOModule(const char* path,
Owen Anderson25209b42009-07-01 16:58:40 +000053 std::string& errMsg);
Nick Kledzik6d886992008-02-26 20:26:43 +000054 static LTOModule* makeLTOModule(const void* mem, size_t length,
Owen Anderson25209b42009-07-01 16:58:40 +000055 std::string& errMsg);
Nick Kledzik6d886992008-02-26 20:26:43 +000056
57 const char* getTargetTriple();
58 uint32_t getSymbolCount();
59 lto_symbol_attributes getSymbolAttributes(uint32_t index);
60 const char* getSymbolName(uint32_t index);
61
Nick Kledzik79d0a052008-02-27 22:25:36 +000062 llvm::Module * getLLVVMModule() { return _module.get(); }
Nick Kledzik6d886992008-02-26 20:26:43 +000063
64private:
65 LTOModule(llvm::Module* m, llvm::TargetMachine* t);
66
Nick Kledzik79d0a052008-02-27 22:25:36 +000067 void lazyParseSymbols();
Nick Kledzik6d886992008-02-26 20:26:43 +000068 void addDefinedSymbol(llvm::GlobalValue* def,
69 llvm::Mangler& mangler,
70 bool isFunction);
Nick Kledzik79d0a052008-02-27 22:25:36 +000071 void addPotentialUndefinedSymbol(llvm::GlobalValue* decl,
72 llvm::Mangler &mangler);
Nick Kledzik6d886992008-02-26 20:26:43 +000073 void findExternalRefs(llvm::Value* value,
74 llvm::Mangler& mangler);
Nick Kledzik79d0a052008-02-27 22:25:36 +000075 void addDefinedFunctionSymbol(llvm::Function* f,
76 llvm::Mangler &mangler);
77 void addDefinedDataSymbol(llvm::GlobalValue* v,
78 llvm::Mangler &mangler);
Devang Patelb96e0372008-07-16 18:06:52 +000079 void addAsmGlobalSymbol(const char *);
Nick Kledzikb4c75512009-06-01 20:33:09 +000080 void addObjCClass(llvm::GlobalVariable* clgv);
81 void addObjCCategory(llvm::GlobalVariable* clgv);
82 void addObjCClassRef(llvm::GlobalVariable* clgv);
83 bool objcClassNameFromExpression(llvm::Constant* c,
84 std::string& name);
85
Owen Anderson25209b42009-07-01 16:58:40 +000086 static bool isTargetMatch(llvm::MemoryBuffer* memBuffer,
Nick Kledzik79d0a052008-02-27 22:25:36 +000087 const char* triplePrefix);
Nick Kledzikb4c75512009-06-01 20:33:09 +000088
Owen Anderson25209b42009-07-01 16:58:40 +000089 static LTOModule* makeLTOModule(llvm::MemoryBuffer* buffer,
Nick Kledzik79d0a052008-02-27 22:25:36 +000090 std::string& errMsg);
Evan Chengce914302009-05-30 00:48:34 +000091 static llvm::MemoryBuffer* makeBuffer(const void* mem, size_t length);
Nick Kledzikb4c75512009-06-01 20:33:09 +000092
Nick Kledzik6d886992008-02-26 20:26:43 +000093 typedef llvm::StringMap<uint8_t> StringSet;
94
95 struct NameAndAttributes {
96 const char* name;
97 lto_symbol_attributes attributes;
98 };
99
Nick Kledzik79d0a052008-02-27 22:25:36 +0000100 llvm::OwningPtr<llvm::Module> _module;
101 llvm::OwningPtr<llvm::TargetMachine> _target;
102 bool _symbolsParsed;
103 std::vector<NameAndAttributes> _symbols;
104 // _defines and _undefines only needed to disambiguate tentative definitions
105 StringSet _defines;
Rafael Espindolab4d596f2009-04-24 16:55:21 +0000106 llvm::StringMap<NameAndAttributes> _undefines;
Nick Kledzik6d886992008-02-26 20:26:43 +0000107};
108
Nick Kledzik6d886992008-02-26 20:26:43 +0000109#endif // LTO_MODULE_H
110