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:
 | ||||
|   std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace; | ||||
| 
 | ||||
|   uint64_t align = 4096; | ||||
|   uint64_t imageBase = -1; | ||||
|   uint64_t fileAlign = 512; | ||||
|   uint64_t stackReserve = 1024 * 1024; | ||||
|  |  | |||
|  | @ -36,6 +36,7 @@ | |||
| #include "llvm/Option/Option.h" | ||||
| #include "llvm/Support/Debug.h" | ||||
| #include "llvm/Support/LEB128.h" | ||||
| #include "llvm/Support/MathExtras.h" | ||||
| #include "llvm/Support/Path.h" | ||||
| #include "llvm/Support/Process.h" | ||||
| #include "llvm/Support/TarWriter.h" | ||||
|  | @ -1422,6 +1423,13 @@ void LinkerDriver::link(ArrayRef<const char *> argsArr) { | |||
|   for (auto *arg : args.filtered(OPT_section)) | ||||
|     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
 | ||||
|   for (auto *arg : args.filtered(OPT_aligncomm)) | ||||
|     parseAligncomm(arg->getValue()); | ||||
|  |  | |||
|  | @ -1205,9 +1205,11 @@ void Writer::assignAddresses() { | |||
|   sizeOfHeaders += | ||||
|       config->is64() ? sizeof(pe32plus_header) : sizeof(pe32_header); | ||||
|   sizeOfHeaders = alignTo(sizeOfHeaders, config->fileAlign); | ||||
|   uint64_t rva = pageSize; // The first page is kept unmapped.
 | ||||
|   fileSize = sizeOfHeaders; | ||||
| 
 | ||||
|   // The first page is kept unmapped.
 | ||||
|   uint64_t rva = alignTo(sizeOfHeaders, config->align); | ||||
| 
 | ||||
|   for (OutputSection *sec : outputSections) { | ||||
|     if (sec == relocSec) | ||||
|       addBaserels(); | ||||
|  | @ -1237,10 +1239,10 @@ void Writer::assignAddresses() { | |||
|     sec->header.SizeOfRawData = rawSize; | ||||
|     if (rawSize != 0) | ||||
|       sec->header.PointerToRawData = fileSize; | ||||
|     rva += alignTo(virtualSize, pageSize); | ||||
|     rva += alignTo(virtualSize, config->align); | ||||
|     fileSize += alignTo(rawSize, config->fileAlign); | ||||
|   } | ||||
|   sizeOfImage = alignTo(rva, pageSize); | ||||
|   sizeOfImage = alignTo(rva, config->align); | ||||
| 
 | ||||
|   // Assign addresses to sections in MergeChunks.
 | ||||
|   for (MergeChunk *mc : MergeChunk::instances) | ||||
|  | @ -1309,7 +1311,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() { | |||
|   pe->MinorLinkerVersion = 0; | ||||
| 
 | ||||
|   pe->ImageBase = config->imageBase; | ||||
|   pe->SectionAlignment = pageSize; | ||||
|   pe->SectionAlignment = config->align; | ||||
|   pe->FileAlignment = config->fileAlign; | ||||
|   pe->MajorImageVersion = config->majorImageVersion; | ||||
|   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