@@ -49,7 +49,7 @@ template <class ELFT> class Writer {
49
49
public:
50
50
LLVM_ELF_IMPORT_TYPES_ELFT (ELFT)
51
51
52
- Writer () : buffer(errorHandler().outputBuffer) {}
52
+ Writer (Ctx &ctx ) : ctx(ctx), buffer(errorHandler().outputBuffer) {}
53
53
54
54
void run ();
55
55
@@ -80,6 +80,7 @@ template <class ELFT> class Writer {
80
80
void writeSectionsBinary ();
81
81
void writeBuildId ();
82
82
83
+ Ctx &ctx;
83
84
std::unique_ptr<FileOutputBuffer> &buffer;
84
85
85
86
void addRelIpltSymbols ();
@@ -91,8 +92,8 @@ template <class ELFT> class Writer {
91
92
};
92
93
} // anonymous namespace
93
94
94
- template <class ELFT > void elf::writeResult () {
95
- Writer<ELFT>().run ();
95
+ template <class ELFT > void elf::writeResult (Ctx &ctx ) {
96
+ Writer<ELFT>(ctx ).run ();
96
97
}
97
98
98
99
static void removeEmptyPTLoad (SmallVector<PhdrEntry *, 0 > &phdrs) {
@@ -2409,8 +2410,8 @@ template <class ELFT> void Writer<ELFT>::fixSectionAlignments() {
2409
2410
(config->zSeparate == SeparateSegmentKind::Code && prev &&
2410
2411
(prev->p_flags & PF_X) != (p->p_flags & PF_X)) ||
2411
2412
cmd->type == SHT_LLVM_PART_EHDR)
2412
- cmd->addrExpr = [] {
2413
- return alignToPowerOf2 (ctx.script ->getDot (), config-> maxPageSize );
2413
+ cmd->addrExpr = [&ctx = this -> ctx ] {
2414
+ return alignToPowerOf2 (ctx.script ->getDot (), ctx. arg . maxPageSize );
2414
2415
};
2415
2416
// PT_TLS is at the start of the first RW PT_LOAD. If `p` includes PT_TLS,
2416
2417
// it must be the RW. Align to p_align(PT_TLS) to make sure
@@ -2426,15 +2427,15 @@ template <class ELFT> void Writer<ELFT>::fixSectionAlignments() {
2426
2427
// bug, musl (TLS Variant 1 architectures) before 1.1.23 handled TLS
2427
2428
// blocks correctly. We need to keep the workaround for a while.
2428
2429
else if (ctx.tlsPhdr && ctx.tlsPhdr ->firstSec == p->firstSec )
2429
- cmd->addrExpr = [] {
2430
- return alignToPowerOf2 (ctx.script ->getDot (), config-> maxPageSize ) +
2431
- alignToPowerOf2 (ctx.script ->getDot () % config-> maxPageSize ,
2430
+ cmd->addrExpr = [&ctx = this -> ctx ] {
2431
+ return alignToPowerOf2 (ctx.script ->getDot (), ctx. arg . maxPageSize ) +
2432
+ alignToPowerOf2 (ctx.script ->getDot () % ctx. arg . maxPageSize ,
2432
2433
ctx.tlsPhdr ->p_align );
2433
2434
};
2434
2435
else
2435
- cmd->addrExpr = [] {
2436
- return alignToPowerOf2 (ctx.script ->getDot (), config-> maxPageSize ) +
2437
- ctx.script ->getDot () % config-> maxPageSize ;
2436
+ cmd->addrExpr = [&ctx = this -> ctx ] {
2437
+ return alignToPowerOf2 (ctx.script ->getDot (), ctx. arg . maxPageSize ) +
2438
+ ctx.script ->getDot () % ctx. arg . maxPageSize ;
2438
2439
};
2439
2440
}
2440
2441
};
@@ -2766,7 +2767,7 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
2766
2767
2767
2768
// Open a result file.
2768
2769
template <class ELFT > void Writer<ELFT>::openFile() {
2769
- uint64_t maxSize = config-> is64 ? INT64_MAX : UINT32_MAX;
2770
+ uint64_t maxSize = ctx. arg . is64 ? INT64_MAX : UINT32_MAX;
2770
2771
if (fileSize != size_t (fileSize) || maxSize < fileSize) {
2771
2772
std::string msg;
2772
2773
raw_string_ostream s (msg);
@@ -2778,17 +2779,17 @@ template <class ELFT> void Writer<ELFT>::openFile() {
2778
2779
return ;
2779
2780
}
2780
2781
2781
- unlinkAsync (config-> outputFile );
2782
+ unlinkAsync (ctx. arg . outputFile );
2782
2783
unsigned flags = 0 ;
2783
- if (!config-> relocatable )
2784
+ if (!ctx. arg . relocatable )
2784
2785
flags |= FileOutputBuffer::F_executable;
2785
- if (!config-> mmapOutputFile )
2786
+ if (!ctx. arg . mmapOutputFile )
2786
2787
flags |= FileOutputBuffer::F_no_mmap;
2787
2788
Expected<std::unique_ptr<FileOutputBuffer>> bufferOrErr =
2788
- FileOutputBuffer::create (config-> outputFile , fileSize, flags);
2789
+ FileOutputBuffer::create (ctx. arg . outputFile , fileSize, flags);
2789
2790
2790
2791
if (!bufferOrErr) {
2791
- error (" failed to open " + config-> outputFile + " : " +
2792
+ error (" failed to open " + ctx. arg . outputFile + " : " +
2792
2793
llvm::toString (bufferOrErr.takeError ()));
2793
2794
return ;
2794
2795
}
@@ -2936,7 +2937,7 @@ template <class ELFT> void Writer<ELFT>::writeBuildId() {
2936
2937
part.buildId ->writeBuildId (output);
2937
2938
}
2938
2939
2939
- template void elf::writeResult<ELF32LE>();
2940
- template void elf::writeResult<ELF32BE>();
2941
- template void elf::writeResult<ELF64LE>();
2942
- template void elf::writeResult<ELF64BE>();
2940
+ template void elf::writeResult<ELF32LE>(Ctx & );
2941
+ template void elf::writeResult<ELF32BE>(Ctx & );
2942
+ template void elf::writeResult<ELF64LE>(Ctx & );
2943
+ template void elf::writeResult<ELF64BE>(Ctx & );
0 commit comments