17
17
#include < llvm/Support/FormattedStream.h>
18
18
#include < llvm/ADT/StringMap.h>
19
19
20
+ #include < llvm/Support/TargetRegistry.h>
21
+ #include < llvm/Target/TargetMachine.h>
22
+ #include < llvm/Analysis/TargetTransformInfo.h>
23
+ #include < llvm/Analysis/TargetLibraryInfo.h>
24
+
20
25
using namespace llvm ;
21
26
22
27
#include " julia.h"
@@ -451,13 +456,10 @@ CodeGenOpt::Level CodeGenOptLevelFor(int optlevel)
451
456
452
457
static void addPassesForOptLevel (legacy::PassManager &PM, TargetMachine &TM, raw_svector_ostream &ObjStream, MCContext *Ctx, int optlevel)
453
458
{
454
- auto oldlevel = TM.getOptLevel ();
455
- TM.setOptLevel (CodeGenOptLevelFor (optlevel));
456
459
addTargetPasses (&PM, &TM);
457
460
addOptimizationPasses (&PM, optlevel);
458
461
if (TM.addPassesToEmitMC (PM, Ctx, ObjStream))
459
462
llvm_unreachable (" Target does not support MC emission." );
460
- TM.setOptLevel (oldlevel);
461
463
}
462
464
463
465
CompilerResultT JuliaOJIT::CompilerT::operator ()(Module &M)
@@ -481,8 +483,6 @@ CompilerResultT JuliaOJIT::CompilerT::operator()(Module &M)
481
483
}
482
484
}
483
485
}
484
- auto oldlevel = jit.TM .getOptLevel ();
485
- jit.TM .setOptLevel (CodeGenOptLevelFor (optlevel));
486
486
if (optlevel == 0 )
487
487
jit.PM0 .run (M);
488
488
else if (optlevel == 1 )
@@ -491,7 +491,6 @@ CompilerResultT JuliaOJIT::CompilerT::operator()(Module &M)
491
491
jit.PM2 .run (M);
492
492
else if (optlevel >= 3 )
493
493
jit.PM3 .run (M);
494
- jit.TM .setOptLevel (oldlevel);
495
494
496
495
std::unique_ptr<MemoryBuffer> ObjBuffer (
497
496
new SmallVectorMemoryBuffer (std::move (jit.ObjBufferSV )));
@@ -542,10 +541,15 @@ JuliaOJIT::JuliaOJIT(TargetMachine &TM)
542
541
CompilerT (this )
543
542
)
544
543
{
545
- addPassesForOptLevel (PM0, TM, ObjStream, Ctx, 0 );
546
- addPassesForOptLevel (PM1, TM, ObjStream, Ctx, 1 );
547
- addPassesForOptLevel (PM2, TM, ObjStream, Ctx, 2 );
548
- addPassesForOptLevel (PM3, TM, ObjStream, Ctx, 3 );
544
+ for (int i = 0 ; i < 4 ; i++) {
545
+ TMs[i] = TM.getTarget ().createTargetMachine (TM.getTargetTriple ().getTriple (), TM.getTargetCPU (),
546
+ TM.getTargetFeatureString (), TM.Options , Reloc::Static, TM.getCodeModel (),
547
+ CodeGenOptLevelFor (i), true );
548
+ }
549
+ addPassesForOptLevel (PM0, *TMs[0 ], ObjStream, Ctx, 0 );
550
+ addPassesForOptLevel (PM1, *TMs[1 ], ObjStream, Ctx, 1 );
551
+ addPassesForOptLevel (PM2, *TMs[2 ], ObjStream, Ctx, 2 );
552
+ addPassesForOptLevel (PM3, *TMs[3 ], ObjStream, Ctx, 3 );
549
553
550
554
// Make sure SectionMemoryManager::getSymbolAddressInProcess can resolve
551
555
// symbols in the program as well. The nullptr argument to the function
0 commit comments