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)
 | 
			
		||||
        Dot = Cmd->AddrExpr(Dot);
 | 
			
		||||
 | 
			
		||||
      if (Cmd->AlignExpr)
 | 
			
		||||
        Sec->updateAlignment(Cmd->AlignExpr(Dot));
 | 
			
		||||
 | 
			
		||||
      if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) {
 | 
			
		||||
        uintX_t TVA = Dot + ThreadBssOffset;
 | 
			
		||||
        TVA = alignTo(TVA, Sec->getAlignment());
 | 
			
		||||
| 
						 | 
				
			
			@ -433,6 +436,7 @@ private:
 | 
			
		|||
  std::vector<StringRef> readOutputSectionPhdrs();
 | 
			
		||||
  unsigned readPhdrType();
 | 
			
		||||
  void readProvide(bool Hidden);
 | 
			
		||||
  void readAlign(OutputSectionCommand *Cmd);
 | 
			
		||||
 | 
			
		||||
  Expr readExpr();
 | 
			
		||||
  Expr readExpr1(Expr Lhs, int MinPrec);
 | 
			
		||||
| 
						 | 
				
			
			@ -671,6 +675,12 @@ void ScriptParser::readKeep(OutputSectionCommand *Cmd) {
 | 
			
		|||
  expect(")");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ScriptParser::readAlign(OutputSectionCommand *Cmd) {
 | 
			
		||||
  expect("(");
 | 
			
		||||
  Cmd->AlignExpr = readExpr();
 | 
			
		||||
  expect(")");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
 | 
			
		||||
  OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec);
 | 
			
		||||
  Opt.Commands.emplace_back(Cmd);
 | 
			
		||||
| 
						 | 
				
			
			@ -682,6 +692,9 @@ void ScriptParser::readOutputSectionDescription(StringRef OutSec) {
 | 
			
		|||
 | 
			
		||||
  expect(":");
 | 
			
		||||
 | 
			
		||||
  if (skip("ALIGN"))
 | 
			
		||||
    readAlign(Cmd);
 | 
			
		||||
 | 
			
		||||
  // Parse constraints.
 | 
			
		||||
  if (skip("ONLY_IF_RO"))
 | 
			
		||||
    Cmd->Constraint = ConstraintKind::ReadOnly;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,6 +73,7 @@ struct OutputSectionCommand : BaseCommand {
 | 
			
		|||
  static bool classof(const BaseCommand *C);
 | 
			
		||||
  StringRef Name;
 | 
			
		||||
  Expr AddrExpr;
 | 
			
		||||
  Expr AlignExpr;
 | 
			
		||||
  std::vector<std::unique_ptr<BaseCommand>> Commands;
 | 
			
		||||
  std::vector<StringRef> Phdrs;
 | 
			
		||||
  std::vector<uint8_t> Filler;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
# REQUIRES: x86
 | 
			
		||||
# 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:  . = 0x10000; \
 | 
			
		||||
# RUN:  .aaa : \
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +28,25 @@
 | 
			
		|||
# CHECK-NEXT:   2 .bbb          00000008 0000000000011000 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
 | 
			
		||||
_start:
 | 
			
		||||
 nop
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue