From 9c7dd8ca502a6397839f7462609f19897855830d Mon Sep 17 00:00:00 2001 From: Dmitry Mikulin Date: Tue, 15 Oct 2019 18:31:10 +0000 Subject: [PATCH] Added support for "#pragma clang section relro=" Differential Revision: https://reviews.llvm.org/D68806 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374934 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/GlobalVariable.h | 1 + lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 2 + lib/Target/TargetLoweringObjectFile.cpp | 1 + test/MC/ELF/section-relro.ll | 65 ++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 test/MC/ELF/section-relro.ll diff --git a/include/llvm/IR/GlobalVariable.h b/include/llvm/IR/GlobalVariable.h index 2e2c8c47791..2c730bc312e 100644 --- a/include/llvm/IR/GlobalVariable.h +++ b/include/llvm/IR/GlobalVariable.h @@ -243,6 +243,7 @@ public: bool hasImplicitSection() const { return getAttributes().hasAttribute("bss-section") || getAttributes().hasAttribute("data-section") || + getAttributes().hasAttribute("relro-section") || getAttributes().hasAttribute("rodata-section"); } diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 89a98bba65e..4978f4b9500 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -568,6 +568,8 @@ MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal( SectionName = Attrs.getAttribute("bss-section").getValueAsString(); } else if (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly()) { SectionName = Attrs.getAttribute("rodata-section").getValueAsString(); + } else if (Attrs.hasAttribute("relro-section") && Kind.isReadOnlyWithRel()) { + SectionName = Attrs.getAttribute("relro-section").getValueAsString(); } else if (Attrs.hasAttribute("data-section") && Kind.isData()) { SectionName = Attrs.getAttribute("data-section").getValueAsString(); } diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index 17274e1c2c6..dcd3934de0f 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -253,6 +253,7 @@ MCSection *TargetLoweringObjectFile::SectionForGlobal( auto Attrs = GVar->getAttributes(); if ((Attrs.hasAttribute("bss-section") && Kind.isBSS()) || (Attrs.hasAttribute("data-section") && Kind.isData()) || + (Attrs.hasAttribute("relro-section") && Kind.isReadOnlyWithRel()) || (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly())) { return getExplicitSectionGlobal(GO, Kind, TM); } diff --git a/test/MC/ELF/section-relro.ll b/test/MC/ELF/section-relro.ll new file mode 100644 index 00000000000..27fc109dea5 --- /dev/null +++ b/test/MC/ELF/section-relro.ll @@ -0,0 +1,65 @@ +; Tests that data and relro are correctly placed in sections +; specified by "#pragma clang section" +; RUN: llc -filetype=obj -mtriple x86_64-unknown-linux %s -o - | llvm-readobj -S -t | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux" + +@funcs_relro = hidden constant [2 x i32 ()*] [i32 ()* bitcast (i32 (...)* @func1 to i32 ()*), i32 ()* bitcast (i32 (...)* @func2 to i32 ()*)], align 16 #0 +@var_data = hidden global i32 33, align 4 #0 + +declare i32 @func1(...) +declare i32 @func2(...) + +; Function Attrs: noinline nounwind optnone sspstrong uwtable +define hidden i32 @foo(i32 %i) { +entry: + %i.addr = alloca i32, align 4 + store i32 %i, i32* %i.addr, align 4 + %0 = load i32, i32* %i.addr, align 4 + %idxprom = sext i32 %0 to i64 + %arrayidx = getelementptr inbounds [2 x i32 ()*], [2 x i32 ()*]* @funcs_relro, i64 0, i64 %idxprom + %1 = load i32 ()*, i32 ()** %arrayidx, align 8 + %call = call i32 %1() + %2 = load i32, i32* @var_data, align 4 + %add = add nsw i32 %call, %2 + ret i32 %add +} + +attributes #0 = { "data-section"=".my_data" "relro-section"=".my_relro" "rodata-section"=".my_rodata" } + +; CHECK: Section { +; CHECK: Index: +; CHECK: Name: .my_rodata +; CHECK: Type: SHT_PROGBITS (0x1) +; CHECK: Flags [ (0x2) +; CHECK: SHF_ALLOC (0x2) +; CHECK: ] +; CHECK: Size: 16 +; CHECK: } +; CHECK: Section { +; CHECK: Index: +; CHECK: Name: .my_data +; CHECK: Type: SHT_PROGBITS (0x1) +; CHECK: Flags [ (0x3) +; CHECK: SHF_ALLOC (0x2) +; CHECK: SHF_WRITE (0x1) +; CHECK: ] +; CHECK: Size: 4 +; CHECK: } +; CHECK: Symbol { +; CHECK: Name: funcs_relro +; CHECK: Value: 0x0 +; CHECK: Size: 16 +; CHECK: Binding: Global (0x1) +; CHECK: Type: Object (0x1) +; CHECK: Section: .my_rodata +; CHECK: } +; CHECK: Symbol { +; CHECK: Name: var_data +; CHECK: Value: 0x0 +; CHECK: Size: 4 +; CHECK: Binding: Global (0x1) +; CHECK: Type: Object (0x1) +; CHECK: Section: .my_data +; CHECK: } -- 2.40.0