Handle /align option.
Differential Revision: https://reviews.llvm.org/D65736 llvm-svn: 368145
This commit is contained in:
		
							parent
							
								
									6c5fc94093
								
							
						
					
					
						commit
						e6a33e1f11
					
				|  | @ -189,6 +189,7 @@ struct Configuration { | ||||||
|   // Used for /thinlto-object-suffix-replace:
 |   // Used for /thinlto-object-suffix-replace:
 | ||||||
|   std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace; |   std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace; | ||||||
| 
 | 
 | ||||||
|  |   uint64_t align = 4096; | ||||||
|   uint64_t imageBase = -1; |   uint64_t imageBase = -1; | ||||||
|   uint64_t fileAlign = 512; |   uint64_t fileAlign = 512; | ||||||
|   uint64_t stackReserve = 1024 * 1024; |   uint64_t stackReserve = 1024 * 1024; | ||||||
|  |  | ||||||
|  | @ -36,6 +36,7 @@ | ||||||
| #include "llvm/Option/Option.h" | #include "llvm/Option/Option.h" | ||||||
| #include "llvm/Support/Debug.h" | #include "llvm/Support/Debug.h" | ||||||
| #include "llvm/Support/LEB128.h" | #include "llvm/Support/LEB128.h" | ||||||
|  | #include "llvm/Support/MathExtras.h" | ||||||
| #include "llvm/Support/Path.h" | #include "llvm/Support/Path.h" | ||||||
| #include "llvm/Support/Process.h" | #include "llvm/Support/Process.h" | ||||||
| #include "llvm/Support/TarWriter.h" | #include "llvm/Support/TarWriter.h" | ||||||
|  | @ -1422,6 +1423,13 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) { | ||||||
|   for (auto *arg : args.filtered(OPT_section)) |   for (auto *arg : args.filtered(OPT_section)) | ||||||
|     parseSection(arg->getValue()); |     parseSection(arg->getValue()); | ||||||
| 
 | 
 | ||||||
|  |   // Handle /align
 | ||||||
|  |   if (auto *arg = args.getLastArg(OPT_align)) { | ||||||
|  |     parseNumbers(arg->getValue(), &config->align); | ||||||
|  |     if (!isPowerOf2_64(config->align)) | ||||||
|  |       error("/align: not a power of two: " + StringRef(arg->getValue())); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   // Handle /aligncomm
 |   // Handle /aligncomm
 | ||||||
|   for (auto *arg : args.filtered(OPT_aligncomm)) |   for (auto *arg : args.filtered(OPT_aligncomm)) | ||||||
|     parseAligncomm(arg->getValue()); |     parseAligncomm(arg->getValue()); | ||||||
|  |  | ||||||
|  | @ -1205,9 +1205,11 @@ void Writer::assignAddresses() { | ||||||
|   sizeOfHeaders += |   sizeOfHeaders += | ||||||
|       config->is64() ? sizeof(pe32plus_header) : sizeof(pe32_header); |       config->is64() ? sizeof(pe32plus_header) : sizeof(pe32_header); | ||||||
|   sizeOfHeaders = alignTo(sizeOfHeaders, config->fileAlign); |   sizeOfHeaders = alignTo(sizeOfHeaders, config->fileAlign); | ||||||
|   uint64_t rva = pageSize; // The first page is kept unmapped.
 |  | ||||||
|   fileSize = sizeOfHeaders; |   fileSize = sizeOfHeaders; | ||||||
| 
 | 
 | ||||||
|  |   // The first page is kept unmapped.
 | ||||||
|  |   uint64_t rva = alignTo(sizeOfHeaders, config->align); | ||||||
|  | 
 | ||||||
|   for (OutputSection *sec : outputSections) { |   for (OutputSection *sec : outputSections) { | ||||||
|     if (sec == relocSec) |     if (sec == relocSec) | ||||||
|       addBaserels(); |       addBaserels(); | ||||||
|  | @ -1237,10 +1239,10 @@ void Writer::assignAddresses() { | ||||||
|     sec->header.SizeOfRawData = rawSize; |     sec->header.SizeOfRawData = rawSize; | ||||||
|     if (rawSize != 0) |     if (rawSize != 0) | ||||||
|       sec->header.PointerToRawData = fileSize; |       sec->header.PointerToRawData = fileSize; | ||||||
|     rva += alignTo(virtualSize, pageSize); |     rva += alignTo(virtualSize, config->align); | ||||||
|     fileSize += alignTo(rawSize, config->fileAlign); |     fileSize += alignTo(rawSize, config->fileAlign); | ||||||
|   } |   } | ||||||
|   sizeOfImage = alignTo(rva, pageSize); |   sizeOfImage = alignTo(rva, config->align); | ||||||
| 
 | 
 | ||||||
|   // Assign addresses to sections in MergeChunks.
 |   // Assign addresses to sections in MergeChunks.
 | ||||||
|   for (MergeChunk *mc : MergeChunk::instances) |   for (MergeChunk *mc : MergeChunk::instances) | ||||||
|  | @ -1309,7 +1311,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() { | ||||||
|   pe->MinorLinkerVersion = 0; |   pe->MinorLinkerVersion = 0; | ||||||
| 
 | 
 | ||||||
|   pe->ImageBase = config->imageBase; |   pe->ImageBase = config->imageBase; | ||||||
|   pe->SectionAlignment = pageSize; |   pe->SectionAlignment = config->align; | ||||||
|   pe->FileAlignment = config->fileAlign; |   pe->FileAlignment = config->fileAlign; | ||||||
|   pe->MajorImageVersion = config->majorImageVersion; |   pe->MajorImageVersion = config->majorImageVersion; | ||||||
|   pe->MinorImageVersion = config->minorImageVersion; |   pe->MinorImageVersion = config->minorImageVersion; | ||||||
|  |  | ||||||
|  | @ -0,0 +1,45 @@ | ||||||
|  | # RUN: yaml2obj < %s > %t.obj | ||||||
|  | # RUN: lld-link /out:%t.exe /entry:main /align:32 %t.obj | ||||||
|  | # RUN: llvm-readobj --file-headers %t.exe | FileCheck %s | ||||||
|  | 
 | ||||||
|  | # CHECK: SectionAlignment: 32 | ||||||
|  | 
 | ||||||
|  | --- !COFF | ||||||
|  | header: | ||||||
|  |   Machine:         IMAGE_FILE_MACHINE_AMD64 | ||||||
|  |   Characteristics: [] | ||||||
|  | sections: | ||||||
|  |   - Name:            .text
 | ||||||
|  |     Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] | ||||||
|  |     Alignment:       4096 | ||||||
|  |     SectionData:     0000000000000000 | ||||||
|  |     Relocations: | ||||||
|  |       - VirtualAddress:  0 | ||||||
|  |         SymbolName:      __ImageBase | ||||||
|  |         Type:            IMAGE_REL_AMD64_ADDR64 | ||||||
|  | symbols: | ||||||
|  |   - Name:            .text
 | ||||||
|  |     Value:           0 | ||||||
|  |     SectionNumber:   1 | ||||||
|  |     SimpleType:      IMAGE_SYM_TYPE_NULL | ||||||
|  |     ComplexType:     IMAGE_SYM_DTYPE_NULL | ||||||
|  |     StorageClass:    IMAGE_SYM_CLASS_STATIC | ||||||
|  |     SectionDefinition: | ||||||
|  |       Length:          8 | ||||||
|  |       NumberOfRelocations: 1 | ||||||
|  |       NumberOfLinenumbers: 0 | ||||||
|  |       CheckSum:        0 | ||||||
|  |       Number:          0 | ||||||
|  |   - Name:            main | ||||||
|  |     Value:           0 | ||||||
|  |     SectionNumber:   1 | ||||||
|  |     SimpleType:      IMAGE_SYM_TYPE_NULL | ||||||
|  |     ComplexType:     IMAGE_SYM_DTYPE_NULL | ||||||
|  |     StorageClass:    IMAGE_SYM_CLASS_EXTERNAL | ||||||
|  |   - Name:            __ImageBase | ||||||
|  |     Value:           0 | ||||||
|  |     SectionNumber:   0 | ||||||
|  |     SimpleType:      IMAGE_SYM_TYPE_NULL | ||||||
|  |     ComplexType:     IMAGE_SYM_DTYPE_NULL | ||||||
|  |     StorageClass:    IMAGE_SYM_CLASS_EXTERNAL | ||||||
|  | ... | ||||||
		Loading…
	
		Reference in New Issue
	
	 Rui Ueyama
						Rui Ueyama