forked from OSchip/llvm-project
				
			[ELF] - Linkerscript: implemented ALIGN modificatior of output sections.
Output section description can contain ALIGN modificator: https://sourceware.org/binutils/docs/ld/Output-Section-Description.html#Output-Section-Description Patch implements it. Differential revision: https://reviews.llvm.org/D22674 llvm-svn: 276780
This commit is contained in:
		
							parent
							
								
									cb42ea0b4f
								
							
						
					
					
						commit
						630c617912
					
				| 
						 | 
					@ -226,6 +226,9 @@ void LinkerScript<ELFT>::assignAddresses(
 | 
				
			||||||
      if (Cmd->AddrExpr)
 | 
					      if (Cmd->AddrExpr)
 | 
				
			||||||
        Dot = Cmd->AddrExpr(Dot);
 | 
					        Dot = Cmd->AddrExpr(Dot);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (Cmd->AlignExpr)
 | 
				
			||||||
 | 
					        Sec->updateAlignment(Cmd->AlignExpr(Dot));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
 | 
					      if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
 | 
				
			||||||
        uintX_t TVA = Dot + ThreadBssOffset;
 | 
					        uintX_t TVA = Dot + ThreadBssOffset;
 | 
				
			||||||
        TVA = alignTo(TVA, Sec->getAlignment());
 | 
					        TVA = alignTo(TVA, Sec->getAlignment());
 | 
				
			||||||
| 
						 | 
					@ -433,6 +436,7 @@ private:
 | 
				
			||||||
  std::vector<StringRef> readOutputSectionPhdrs();
 | 
					  std::vector<StringRef> readOutputSectionPhdrs();
 | 
				
			||||||
  unsigned readPhdrType();
 | 
					  unsigned readPhdrType();
 | 
				
			||||||
  void readProvide(bool Hidden);
 | 
					  void readProvide(bool Hidden);
 | 
				
			||||||
 | 
					  void readAlign(OutputSectionCommand *Cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Expr readExpr();
 | 
					  Expr readExpr();
 | 
				
			||||||
  Expr readExpr1(Expr Lhs, int MinPrec);
 | 
					  Expr readExpr1(Expr Lhs, int MinPrec);
 | 
				
			||||||
| 
						 | 
					@ -671,6 +675,12 @@ void ScriptParser::readKeep(OutputSectionCommand *Cmd) {
 | 
				
			||||||
  expect(")");
 | 
					  expect(")");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ScriptParser::readAlign(OutputSectionCommand *Cmd) {
 | 
				
			||||||
 | 
					  expect("(");
 | 
				
			||||||
 | 
					  Cmd->AlignExpr = readExpr();
 | 
				
			||||||
 | 
					  expect(")");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
 | 
					void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
 | 
				
			||||||
  OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec);
 | 
					  OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec);
 | 
				
			||||||
  Opt.Commands.emplace_back(Cmd);
 | 
					  Opt.Commands.emplace_back(Cmd);
 | 
				
			||||||
| 
						 | 
					@ -682,6 +692,9 @@ void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  expect(":");
 | 
					  expect(":");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (skip("ALIGN"))
 | 
				
			||||||
 | 
					    readAlign(Cmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Parse constraints.
 | 
					  // Parse constraints.
 | 
				
			||||||
  if (skip("ONLY_IF_RO"))
 | 
					  if (skip("ONLY_IF_RO"))
 | 
				
			||||||
    Cmd->Constraint = ConstraintKind::ReadOnly;
 | 
					    Cmd->Constraint = ConstraintKind::ReadOnly;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,6 +73,7 @@ struct OutputSectionCommand : BaseCommand {
 | 
				
			||||||
  static bool classof(const BaseCommand *C);
 | 
					  static bool classof(const BaseCommand *C);
 | 
				
			||||||
  StringRef Name;
 | 
					  StringRef Name;
 | 
				
			||||||
  Expr AddrExpr;
 | 
					  Expr AddrExpr;
 | 
				
			||||||
 | 
					  Expr AlignExpr;
 | 
				
			||||||
  std::vector<std::unique_ptr<BaseCommand>> Commands;
 | 
					  std::vector<std::unique_ptr<BaseCommand>> Commands;
 | 
				
			||||||
  std::vector<StringRef> Phdrs;
 | 
					  std::vector<StringRef> Phdrs;
 | 
				
			||||||
  std::vector<uint8_t> Filler;
 | 
					  std::vector<uint8_t> Filler;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
# REQUIRES: x86
 | 
					# REQUIRES: x86
 | 
				
			||||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
 | 
					# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Check that ALIGN command workable using location counter
 | 
				
			||||||
# RUN: echo "SECTIONS { \
 | 
					# RUN: echo "SECTIONS { \
 | 
				
			||||||
# RUN:  . = 0x10000; \
 | 
					# RUN:  . = 0x10000; \
 | 
				
			||||||
# RUN:  .aaa : \
 | 
					# RUN:  .aaa : \
 | 
				
			||||||
| 
						 | 
					@ -27,6 +28,25 @@
 | 
				
			||||||
# CHECK-NEXT:   2 .bbb          00000008 0000000000011000 DATA
 | 
					# CHECK-NEXT:   2 .bbb          00000008 0000000000011000 DATA
 | 
				
			||||||
# CHECK-NEXT:   3 .ccc          00000008 0000000000014000 DATA
 | 
					# CHECK-NEXT:   3 .ccc          00000008 0000000000014000 DATA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Check output sections ALIGN modificator
 | 
				
			||||||
 | 
					# RUN: echo "SECTIONS { \
 | 
				
			||||||
 | 
					# RUN:  . = 0x10000; \
 | 
				
			||||||
 | 
					# RUN:  .aaa : \
 | 
				
			||||||
 | 
					# RUN:  { \
 | 
				
			||||||
 | 
					# RUN:   *(.aaa) \
 | 
				
			||||||
 | 
					# RUN:  } \
 | 
				
			||||||
 | 
					# RUN:  .bbb : ALIGN(4096) \
 | 
				
			||||||
 | 
					# RUN:  { \
 | 
				
			||||||
 | 
					# RUN:   *(.bbb) \
 | 
				
			||||||
 | 
					# RUN:  } \
 | 
				
			||||||
 | 
					# RUN:  .ccc : ALIGN(4096 * 4) \
 | 
				
			||||||
 | 
					# RUN:  { \
 | 
				
			||||||
 | 
					# RUN:   *(.ccc) \
 | 
				
			||||||
 | 
					# RUN:  } \
 | 
				
			||||||
 | 
					# RUN: }" > %t2.script
 | 
				
			||||||
 | 
					# RUN: ld.lld -o %t2 --script %t2.script %t
 | 
				
			||||||
 | 
					# RUN: llvm-objdump -section-headers %t1 | FileCheck %s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.global _start
 | 
					.global _start
 | 
				
			||||||
_start:
 | 
					_start:
 | 
				
			||||||
 nop
 | 
					 nop
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue