From f49fe218c2250ad507083c7666502832784f00ae Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 6 Dec 2018 08:34:52 +0000 Subject: [PATCH] [LLD][ELF] - Linker script: accept using a file name without a list of sections. This is a part of https://bugs.llvm.org/show_bug.cgi?id=39885 Linker script specification says: "You can specify a file name to include sections from a particular file. You would do this if one or more of your files contain special data that needs to be at a particular location in memory." LLD did not accept this syntax. The patch implements it. Differential revision: https://reviews.llvm.org/D55324 llvm-svn: 348463 --- lld/ELF/LinkerScript.h | 4 +++- lld/ELF/ScriptParser.cpp | 7 ++++++- lld/test/ELF/linkerscript/no-filename-spec.s | 17 +++++++++++++++++ lld/test/ELF/linkerscript/sort.s | 5 ----- 4 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 lld/test/ELF/linkerscript/no-filename-spec.s diff --git a/lld/ELF/LinkerScript.h b/lld/ELF/LinkerScript.h index 1a0efa5..5116198 100644 --- a/lld/ELF/LinkerScript.h +++ b/lld/ELF/LinkerScript.h @@ -146,7 +146,9 @@ struct MemoryRegion { // Also it may be surrounded with SORT() command, so contains sorting rules. struct SectionPattern { SectionPattern(StringMatcher &&Pat1, StringMatcher &&Pat2) - : ExcludedFilePat(Pat1), SectionPat(Pat2) {} + : ExcludedFilePat(Pat1), SectionPat(Pat2), + SortOuter(SortSectionPolicy::Default), + SortInner(SortSectionPolicy::Default) {} StringMatcher ExcludedFilePat; StringMatcher SectionPat; diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index dc9fb0d..8140677 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -854,7 +854,12 @@ OutputSection *ScriptParser::readOutputSectionDescription(StringRef OutSec) { } else if (peek() == "(") { Cmd->SectionCommands.push_back(readInputSectionDescription(Tok)); } else { - setError("unknown command " + Tok); + // We have a file name and no input sections description. It is not a + // commonly used syntax, but still acceptable. In that case, all sections + // from the file will be included. + InputSectionDescription *ISD = make(Tok); + ISD->SectionPatterns.push_back({{}, StringMatcher({"*"})}); + Cmd->SectionCommands.push_back(ISD); } } diff --git a/lld/test/ELF/linkerscript/no-filename-spec.s b/lld/test/ELF/linkerscript/no-filename-spec.s new file mode 100644 index 0000000..aec0395 --- /dev/null +++ b/lld/test/ELF/linkerscript/no-filename-spec.s @@ -0,0 +1,17 @@ +# REQUIRES: x86 +# RUN: echo '.section .bar, "a"; .quad 1;' | \ +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux - -o %tfile1.o +# RUN: echo '.section .zed, "a"; .quad 2;' | \ +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux - -o %tfile2.o + +## We have a file name and no input sections description. In that case, all +## sections from the file specified should be included. Check that. +# RUN: ld.lld -o %t --script %s %tfile1.o %tfile2.o +# RUN: llvm-objdump -s %t | FileCheck %s + +# CHECK: Contents of section .foo: +# CHECK-NEXT: 01000000 00000000 02000000 00000000 + +SECTIONS { + .foo : { *file1.o *file2.o } +} diff --git a/lld/test/ELF/linkerscript/sort.s b/lld/test/ELF/linkerscript/sort.s index abee468..6390ced 100644 --- a/lld/test/ELF/linkerscript/sort.s +++ b/lld/test/ELF/linkerscript/sort.s @@ -95,11 +95,6 @@ # RUN: ld.lld -o %t11 --script %t10.script %t2.o %t1.o # RUN: llvm-objdump -s %t11 | FileCheck -check-prefix=SORTED_A %s -## There is no SORTFOO command, check we handle it properly. -# RUN: echo "SECTIONS { .aaa : { SORTFOO } }" > %t3.script -# RUN: not ld.lld -o %t3 --script %t3.script %t1.o 2>&1 | FileCheck %s -check-prefix=SORTFOO -# SORTFOO: unknown command SORTFOO - .global _start _start: nop -- 2.7.4