annotate tools/lto/lto.cpp @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents 7d135dc70f03
children 803732b1fca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===-lto.cpp - LLVM Link Time Optimizer ----------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // This file implements the Link Time Optimization library. This library is
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // intended to be used by linker to optimize code at link time.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include "llvm-c/lto.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
16 #include "llvm/ADT/STLExtras.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
17 #include "llvm/Bitcode/BitcodeReader.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/CodeGen/CommandFlags.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
19 #include "llvm/IR/DiagnosticInfo.h"
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
20 #include "llvm/IR/DiagnosticPrinter.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
21 #include "llvm/IR/LLVMContext.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
22 #include "llvm/LTO/legacy/LTOCodeGenerator.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
23 #include "llvm/LTO/legacy/LTOModule.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
24 #include "llvm/LTO/legacy/ThinLTOCodeGenerator.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
25 #include "llvm/Support/MemoryBuffer.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
26 #include "llvm/Support/Signals.h"
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
27 #include "llvm/Support/TargetSelect.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
28 #include "llvm/Support/raw_ostream.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 // extra command-line flags needed for LTOCodeGenerator
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
31 static cl::opt<char>
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
32 OptLevel("O",
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
33 cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
34 "(default = '-O2')"),
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
35 cl::Prefix,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
36 cl::ZeroOrMore,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
37 cl::init('2'));
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 static cl::opt<bool>
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 DisableInline("disable-inlining", cl::init(false),
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 cl::desc("Do not run the inliner pass"));
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 static cl::opt<bool>
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 DisableGVNLoadPRE("disable-gvn-loadpre", cl::init(false),
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 cl::desc("Do not run the GVN load PRE pass"));
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
47 static cl::opt<bool>
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
48 DisableLTOVectorization("disable-lto-vectorization", cl::init(false),
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
49 cl::desc("Do not run loop or slp vectorization during LTO"));
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
50
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
51 #ifdef NDEBUG
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
52 static bool VerifyByDefault = false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
53 #else
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
54 static bool VerifyByDefault = true;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
55 #endif
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
56
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
57 static cl::opt<bool> DisableVerify(
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
58 "disable-llvm-verifier", cl::init(!VerifyByDefault),
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
59 cl::desc("Don't run the LLVM verifier during the optimization pipeline"));
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
60
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 // Holds most recent error string.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 // *** Not thread safe ***
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 static std::string sLastErrorString;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 // Holds the initialization state of the LTO module.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 // *** Not thread safe ***
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 static bool initialized = false;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 // Holds the command-line option parsing state of the LTO module.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 static bool parsedOptions = false;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
72 static LLVMContext *LTOContext = nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
73
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
74 static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
75 if (DI.getSeverity() != DS_Error) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
76 DiagnosticPrinterRawOStream DP(errs());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
77 DI.print(DP);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
78 errs() << '\n';
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
79 return;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
80 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
81 sLastErrorString = "";
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
82 {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
83 raw_string_ostream Stream(sLastErrorString);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
84 DiagnosticPrinterRawOStream DP(Stream);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
85 DI.print(DP);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
86 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
87 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
88
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 // Initialize the configured targets if they have not been initialized.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 static void lto_initialize() {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 if (!initialized) {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
92 #ifdef LLVM_ON_WIN32
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
93 // Dialog box on crash disabling doesn't work across DLL boundaries, so do
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
94 // it here.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
95 llvm::sys::DisableSystemDialogsOnCrash();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
96 #endif
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
97
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
98 InitializeAllTargetInfos();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
99 InitializeAllTargets();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
100 InitializeAllTargetMCs();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
101 InitializeAllAsmParsers();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
102 InitializeAllAsmPrinters();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
103 InitializeAllDisassemblers();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
104
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
105 static LLVMContext Context;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
106 LTOContext = &Context;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
107 LTOContext->setDiagnosticHandler(diagnosticHandler, nullptr, true);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 initialized = true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
112 namespace {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
113
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
114 static void handleLibLTODiagnostic(lto_codegen_diagnostic_severity_t Severity,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
115 const char *Msg, void *) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
116 sLastErrorString = Msg;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
117 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
118
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
119 // This derived class owns the native object file. This helps implement the
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
120 // libLTO API semantics, which require that the code generator owns the object
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
121 // file.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
122 struct LibLTOCodeGenerator : LTOCodeGenerator {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
123 LibLTOCodeGenerator() : LTOCodeGenerator(*LTOContext) { init(); }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
124 LibLTOCodeGenerator(std::unique_ptr<LLVMContext> Context)
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
125 : LTOCodeGenerator(*Context), OwnedContext(std::move(Context)) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
126 init();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
127 }
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
128
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
129 // Reset the module first in case MergedModule is created in OwnedContext.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
130 // Module must be destructed before its context gets destructed.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
131 ~LibLTOCodeGenerator() { resetMergedModule(); }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
132
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
133 void init() { setDiagnosticHandler(handleLibLTODiagnostic, nullptr); }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
134
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
135 std::unique_ptr<MemoryBuffer> NativeObjectFile;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
136 std::unique_ptr<LLVMContext> OwnedContext;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
137 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
138
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
139 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
140
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
141 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LibLTOCodeGenerator, lto_code_gen_t)
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
142 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThinLTOCodeGenerator, thinlto_code_gen_t)
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
143 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOModule, lto_module_t)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
144
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
145 // Convert the subtarget features into a string to pass to LTOCodeGenerator.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
146 static void lto_add_attrs(lto_code_gen_t cg) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
147 LTOCodeGenerator *CG = unwrap(cg);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
148 if (MAttrs.size()) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
149 std::string attrs;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
150 for (unsigned i = 0; i < MAttrs.size(); ++i) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
151 if (i > 0)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
152 attrs.append(",");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
153 attrs.append(MAttrs[i]);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
154 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
155
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
156 CG->setAttr(attrs);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
157 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
158
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
159 if (OptLevel < '0' || OptLevel > '3')
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
160 report_fatal_error("Optimization level must be between 0 and 3");
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
161 CG->setOptLevel(OptLevel - '0');
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 extern const char* lto_get_version() {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 return LTOCodeGenerator::getVersionString();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 const char* lto_get_error_message() {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 return sLastErrorString.c_str();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 bool lto_module_is_object_file(const char* path) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
173 return LTOModule::isBitcodeFile(StringRef(path));
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 bool lto_module_is_object_file_for_target(const char* path,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 const char* target_triplet_prefix) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
178 ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer = MemoryBuffer::getFile(path);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
179 if (!Buffer)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
180 return false;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
181 return LTOModule::isBitcodeForTarget(Buffer->get(),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
182 StringRef(target_triplet_prefix));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
183 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
184
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
185 bool lto_module_has_objc_category(const void *mem, size_t length) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
186 std::unique_ptr<MemoryBuffer> Buffer(LTOModule::makeBuffer(mem, length));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
187 if (!Buffer)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
188 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
189 LLVMContext Ctx;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
190 ErrorOr<bool> Result = expectedToErrorOrAndEmitErrors(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
191 Ctx, llvm::isBitcodeContainingObjCCategory(*Buffer));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
192 return Result && *Result;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 bool lto_module_is_object_file_in_memory(const void* mem, size_t length) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 return LTOModule::isBitcodeFile(mem, length);
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 bool
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 lto_module_is_object_file_in_memory_for_target(const void* mem,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 size_t length,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 const char* target_triplet_prefix) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
203 std::unique_ptr<MemoryBuffer> buffer(LTOModule::makeBuffer(mem, length));
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
204 if (!buffer)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
205 return false;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
206 return LTOModule::isBitcodeForTarget(buffer.get(),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
207 StringRef(target_triplet_prefix));
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
210 lto_module_t lto_module_create(const char* path) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
211 lto_initialize();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
212 llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
213 ErrorOr<std::unique_ptr<LTOModule>> M =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
214 LTOModule::createFromFile(*LTOContext, StringRef(path), Options);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
215 if (!M)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
216 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
217 return wrap(M->release());
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
218 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
219
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 lto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 lto_initialize();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
222 llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
223 ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromOpenFile(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
224 *LTOContext, fd, StringRef(path), size, Options);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
225 if (!M)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
226 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
227 return wrap(M->release());
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 lto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 size_t file_size,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 size_t map_size,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 off_t offset) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 lto_initialize();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
235 llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
236 ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromOpenFileSlice(
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
237 *LTOContext, fd, StringRef(path), map_size, offset, Options);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
238 if (!M)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
239 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
240 return wrap(M->release());
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 lto_module_t lto_module_create_from_memory(const void* mem, size_t length) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 lto_initialize();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
245 llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
246 ErrorOr<std::unique_ptr<LTOModule>> M =
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
247 LTOModule::createFromBuffer(*LTOContext, mem, length, Options);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
248 if (!M)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
249 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
250 return wrap(M->release());
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
253 lto_module_t lto_module_create_from_memory_with_path(const void* mem,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
254 size_t length,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
255 const char *path) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
256 lto_initialize();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
257 llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
258 ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromBuffer(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
259 *LTOContext, mem, length, Options, StringRef(path));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
260 if (!M)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
261 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
262 return wrap(M->release());
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
265 lto_module_t lto_module_create_in_local_context(const void *mem, size_t length,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
266 const char *path) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
267 lto_initialize();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
268 llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
269
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
270 // Create a local context. Ownership will be transfered to LTOModule.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
271 std::unique_ptr<LLVMContext> Context = llvm::make_unique<LLVMContext>();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
272 Context->setDiagnosticHandler(diagnosticHandler, nullptr, true);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
273
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
274 ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createInLocalContext(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
275 std::move(Context), mem, length, Options, StringRef(path));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
276 if (!M)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
277 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
278 return wrap(M->release());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
279 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
280
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
281 lto_module_t lto_module_create_in_codegen_context(const void *mem,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
282 size_t length,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
283 const char *path,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
284 lto_code_gen_t cg) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
285 lto_initialize();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
286 llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
287 ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromBuffer(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
288 unwrap(cg)->getContext(), mem, length, Options, StringRef(path));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
289 return wrap(M->release());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
290 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
291
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
292 void lto_module_dispose(lto_module_t mod) { delete unwrap(mod); }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
293
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 const char* lto_module_get_target_triple(lto_module_t mod) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
295 return unwrap(mod)->getTargetTriple().c_str();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
296 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
297
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
298 void lto_module_set_target_triple(lto_module_t mod, const char *triple) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
299 return unwrap(mod)->setTargetTriple(StringRef(triple));
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
302 unsigned int lto_module_get_num_symbols(lto_module_t mod) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
303 return unwrap(mod)->getSymbolCount();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
304 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
305
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
306 const char* lto_module_get_symbol_name(lto_module_t mod, unsigned int index) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
307 return unwrap(mod)->getSymbolName(index).data();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
310 lto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
311 unsigned int index) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
312 return unwrap(mod)->getSymbolAttributes(index);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
313 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
314
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
315 const char* lto_module_get_linkeropts(lto_module_t mod) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
316 return unwrap(mod)->getLinkerOpts().data();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
319 void lto_codegen_set_diagnostic_handler(lto_code_gen_t cg,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
320 lto_diagnostic_handler_t diag_handler,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
321 void *ctxt) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
322 unwrap(cg)->setDiagnosticHandler(diag_handler, ctxt);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
323 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
324
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
325 static lto_code_gen_t createCodeGen(bool InLocalContext) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 lto_initialize();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
328 TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
329
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
330 LibLTOCodeGenerator *CodeGen =
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
331 InLocalContext ? new LibLTOCodeGenerator(make_unique<LLVMContext>())
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
332 : new LibLTOCodeGenerator();
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
333 CodeGen->setTargetOptions(Options);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
334 return wrap(CodeGen);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
336
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
337 lto_code_gen_t lto_codegen_create(void) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
338 return createCodeGen(/* InLocalContext */ false);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
339 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
340
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
341 lto_code_gen_t lto_codegen_create_in_local_context(void) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
342 return createCodeGen(/* InLocalContext */ true);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
343 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
344
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
345 void lto_codegen_dispose(lto_code_gen_t cg) { delete unwrap(cg); }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
346
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 bool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
348 return !unwrap(cg)->addModule(unwrap(mod));
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
350
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
351 void lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
352 unwrap(cg)->setModule(std::unique_ptr<LTOModule>(unwrap(mod)));
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
353 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
354
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 bool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
356 unwrap(cg)->setDebugInfo(debug);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 return false;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
359
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 bool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
361 switch (model) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
362 case LTO_CODEGEN_PIC_MODEL_STATIC:
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
363 unwrap(cg)->setCodePICModel(Reloc::Static);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
364 return false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
365 case LTO_CODEGEN_PIC_MODEL_DYNAMIC:
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
366 unwrap(cg)->setCodePICModel(Reloc::PIC_);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
367 return false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
368 case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC:
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
369 unwrap(cg)->setCodePICModel(Reloc::DynamicNoPIC);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
370 return false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
371 case LTO_CODEGEN_PIC_MODEL_DEFAULT:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
372 unwrap(cg)->setCodePICModel(None);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
373 return false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
374 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
375 sLastErrorString = "Unknown PIC model";
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
376 return true;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
378
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 void lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
380 return unwrap(cg)->setCpu(cpu);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
381 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
382
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 void lto_codegen_set_assembler_path(lto_code_gen_t cg, const char *path) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 // In here only for backwards compatibility. We use MC now.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
386
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 void lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
388 int nargs) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 // In here only for backwards compatibility. We use MC now.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
391
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
392 void lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 const char *symbol) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
394 unwrap(cg)->addMustPreserveSymbol(symbol);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
396
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
397 static void maybeParseOptions(lto_code_gen_t cg) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 if (!parsedOptions) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
399 unwrap(cg)->parseCodeGenDebugOptions();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
400 lto_add_attrs(cg);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 parsedOptions = true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
403 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
404
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
405 bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
406 maybeParseOptions(cg);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
407 return !unwrap(cg)->writeMergedModules(path);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
408 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
409
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
410 const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
411 maybeParseOptions(cg);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
412 LibLTOCodeGenerator *CG = unwrap(cg);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
413 CG->NativeObjectFile =
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
414 CG->compile(DisableVerify, DisableInline, DisableGVNLoadPRE,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
415 DisableLTOVectorization);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
416 if (!CG->NativeObjectFile)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
417 return nullptr;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
418 *length = CG->NativeObjectFile->getBufferSize();
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
419 return CG->NativeObjectFile->getBufferStart();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
420 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
421
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
422 bool lto_codegen_optimize(lto_code_gen_t cg) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
423 maybeParseOptions(cg);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
424 return !unwrap(cg)->optimize(DisableVerify, DisableInline, DisableGVNLoadPRE,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
425 DisableLTOVectorization);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
426 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
427
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
428 const void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
429 maybeParseOptions(cg);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
430 LibLTOCodeGenerator *CG = unwrap(cg);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
431 CG->NativeObjectFile = CG->compileOptimized();
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
432 if (!CG->NativeObjectFile)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
433 return nullptr;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
434 *length = CG->NativeObjectFile->getBufferSize();
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
435 return CG->NativeObjectFile->getBufferStart();
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
437
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
439 maybeParseOptions(cg);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
440 return !unwrap(cg)->compile_to_file(
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
441 name, DisableVerify, DisableInline, DisableGVNLoadPRE,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
442 DisableLTOVectorization);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
444
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 void lto_codegen_debug_options(lto_code_gen_t cg, const char *opt) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
446 unwrap(cg)->setCodeGenDebugOptions(opt);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
448
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
449 unsigned int lto_api_version() { return LTO_API_VERSION; }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
450
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
451 void lto_codegen_set_should_internalize(lto_code_gen_t cg,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
452 bool ShouldInternalize) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
453 unwrap(cg)->setShouldInternalize(ShouldInternalize);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
454 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
455
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
456 void lto_codegen_set_should_embed_uselists(lto_code_gen_t cg,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
457 lto_bool_t ShouldEmbedUselists) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
458 unwrap(cg)->setShouldEmbedUselists(ShouldEmbedUselists);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
459 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
460
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
461 // ThinLTO API below
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
462
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
463 thinlto_code_gen_t thinlto_create_codegen(void) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
464 lto_initialize();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
465 ThinLTOCodeGenerator *CodeGen = new ThinLTOCodeGenerator();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
466 CodeGen->setTargetOptions(InitTargetOptionsFromCodeGenFlags());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
467
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
468 return wrap(CodeGen);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
469 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
470
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
471 void thinlto_codegen_dispose(thinlto_code_gen_t cg) { delete unwrap(cg); }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
472
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
473 void thinlto_codegen_add_module(thinlto_code_gen_t cg, const char *Identifier,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
474 const char *Data, int Length) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
475 unwrap(cg)->addModule(Identifier, StringRef(Data, Length));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
476 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
477
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
478 void thinlto_codegen_process(thinlto_code_gen_t cg) { unwrap(cg)->run(); }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
479
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
480 unsigned int thinlto_module_get_num_objects(thinlto_code_gen_t cg) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
481 return unwrap(cg)->getProducedBinaries().size();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
482 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
483 LTOObjectBuffer thinlto_module_get_object(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
484 unsigned int index) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
485 assert(index < unwrap(cg)->getProducedBinaries().size() && "Index overflow");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
486 auto &MemBuffer = unwrap(cg)->getProducedBinaries()[index];
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
487 return LTOObjectBuffer{MemBuffer->getBufferStart(),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
488 MemBuffer->getBufferSize()};
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
489 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
490
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
491 void thinlto_codegen_disable_codegen(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
492 lto_bool_t disable) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
493 unwrap(cg)->disableCodeGen(disable);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
494 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
495
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
496 void thinlto_codegen_set_codegen_only(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
497 lto_bool_t CodeGenOnly) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
498 unwrap(cg)->setCodeGenOnly(CodeGenOnly);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
499 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
500
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
501 void thinlto_debug_options(const char *const *options, int number) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
502 // if options were requested, set them
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
503 if (number && options) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
504 std::vector<const char *> CodegenArgv(1, "libLTO");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
505 for (auto Arg : ArrayRef<const char *>(options, number))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
506 CodegenArgv.push_back(Arg);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
507 cl::ParseCommandLineOptions(CodegenArgv.size(), CodegenArgv.data());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
508 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
509 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
510
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
511 lto_bool_t lto_module_is_thinlto(lto_module_t mod) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
512 return unwrap(mod)->isThinLTO();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
513 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
514
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
515 void thinlto_codegen_add_must_preserve_symbol(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
516 const char *Name, int Length) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
517 unwrap(cg)->preserveSymbol(StringRef(Name, Length));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
518 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
519
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
520 void thinlto_codegen_add_cross_referenced_symbol(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
521 const char *Name, int Length) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
522 unwrap(cg)->crossReferenceSymbol(StringRef(Name, Length));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
523 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
524
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
525 void thinlto_codegen_set_cpu(thinlto_code_gen_t cg, const char *cpu) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
526 return unwrap(cg)->setCpu(cpu);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
527 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
528
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
529 void thinlto_codegen_set_cache_dir(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
530 const char *cache_dir) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
531 return unwrap(cg)->setCacheDir(cache_dir);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
532 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
533
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
534 void thinlto_codegen_set_cache_pruning_interval(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
535 int interval) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
536 return unwrap(cg)->setCachePruningInterval(interval);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
537 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
538
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
539 void thinlto_codegen_set_cache_entry_expiration(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
540 unsigned expiration) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
541 return unwrap(cg)->setCacheEntryExpiration(expiration);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
542 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
543
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
544 void thinlto_codegen_set_final_cache_size_relative_to_available_space(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
545 thinlto_code_gen_t cg, unsigned Percentage) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
546 return unwrap(cg)->setMaxCacheSizeRelativeToAvailableSpace(Percentage);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
547 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
548
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
549 void thinlto_codegen_set_savetemps_dir(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
550 const char *save_temps_dir) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
551 return unwrap(cg)->setSaveTempsDir(save_temps_dir);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
552 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
553
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
554 lto_bool_t thinlto_codegen_set_pic_model(thinlto_code_gen_t cg,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
555 lto_codegen_model model) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
556 switch (model) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
557 case LTO_CODEGEN_PIC_MODEL_STATIC:
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
558 unwrap(cg)->setCodePICModel(Reloc::Static);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
559 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
560 case LTO_CODEGEN_PIC_MODEL_DYNAMIC:
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
561 unwrap(cg)->setCodePICModel(Reloc::PIC_);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
562 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
563 case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC:
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
564 unwrap(cg)->setCodePICModel(Reloc::DynamicNoPIC);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
565 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
566 case LTO_CODEGEN_PIC_MODEL_DEFAULT:
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
567 unwrap(cg)->setCodePICModel(None);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
568 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
569 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
570 sLastErrorString = "Unknown PIC model";
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
571 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
572 }