From 98bc25a0f2bf169ef13f4dfc8ad3cc863731a8e7 Mon Sep 17 00:00:00 2001 From: Mandeep Singh Grang Date: Sat, 24 Mar 2018 18:37:19 +0000 Subject: [PATCH] [RISCV] Use init_array instead of ctors for RISCV target, by default Summary: LLVM defaults to the newer .init_array/.fini_array scheme for static constructors rather than the less desirable .ctors/.dtors (the UseCtors flag defaults to false). This wasn't being respected in the RISC-V backend because it fails to call TargetLoweringObjectFileELF::InitializeELF with the the appropriate flag for UseInitArray. This patch fixes this by implementing RISCVELFTargetObjectFile and overriding its Initialize method to call InitializeELF(TM.Options.UseInitArray). Reviewers: asb, apazos Reviewed By: asb Subscribers: mgorny, rbar, johnrusso, simoncook, jordy.potman.lists, sabuasal, niosHD, kito-cheng, shiva0217, llvm-commits Differential Revision: https://reviews.llvm.org/D44750 llvm-svn: 328433 --- llvm/lib/Target/RISCV/CMakeLists.txt | 1 + llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 3 ++- llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp | 19 ++++++++++++++++ llvm/lib/Target/RISCV/RISCVTargetObjectFile.h | 25 +++++++++++++++++++++ llvm/test/CodeGen/RISCV/init-array.ll | 30 +++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp create mode 100644 llvm/lib/Target/RISCV/RISCVTargetObjectFile.h create mode 100644 llvm/test/CodeGen/RISCV/init-array.ll diff --git a/llvm/lib/Target/RISCV/CMakeLists.txt b/llvm/lib/Target/RISCV/CMakeLists.txt index 66b50f8..71787d0 100644 --- a/llvm/lib/Target/RISCV/CMakeLists.txt +++ b/llvm/lib/Target/RISCV/CMakeLists.txt @@ -22,6 +22,7 @@ add_llvm_target(RISCVCodeGen RISCVRegisterInfo.cpp RISCVSubtarget.cpp RISCVTargetMachine.cpp + RISCVTargetObjectFile.cpp ) add_subdirectory(AsmParser) diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp index e75fb3b..d025e82 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp @@ -13,6 +13,7 @@ #include "RISCV.h" #include "RISCVTargetMachine.h" +#include "RISCVTargetObjectFile.h" #include "llvm/ADT/STLExtras.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" @@ -59,7 +60,7 @@ RISCVTargetMachine::RISCVTargetMachine(const Target &T, const Triple &TT, : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options, getEffectiveRelocModel(TT, RM), getEffectiveCodeModel(CM), OL), - TLOF(make_unique()), + TLOF(make_unique()), Subtarget(TT, CPU, FS, *this) { initAsmInfo(); } diff --git a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp new file mode 100644 index 0000000..46e81b6 --- /dev/null +++ b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp @@ -0,0 +1,19 @@ +//===-- RISCVTargetObjectFile.cpp - RISCV Object Info -----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "RISCVTargetObjectFile.h" +#include "RISCVTargetMachine.h" + +using namespace llvm; + +void RISCVELFTargetObjectFile::Initialize(MCContext &Ctx, + const TargetMachine &TM) { + TargetLoweringObjectFileELF::Initialize(Ctx, TM); + InitializeELF(TM.Options.UseInitArray); +} diff --git a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.h b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.h new file mode 100644 index 0000000..5467220 --- /dev/null +++ b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.h @@ -0,0 +1,25 @@ +//===-- RISCVTargetObjectFile.h - RISCV Object Info -*- C++ ---------*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_RISCV_RISCVTARGETOBJECTFILE_H +#define LLVM_LIB_TARGET_RISCV_RISCVTARGETOBJECTFILE_H + +#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" + +namespace llvm { +class RISCVTargetMachine; + +/// This implementation is used for RISCV ELF targets. +class RISCVELFTargetObjectFile : public TargetLoweringObjectFileELF { + void Initialize(MCContext &Ctx, const TargetMachine &TM) override; +}; + +} // end namespace llvm + +#endif diff --git a/llvm/test/CodeGen/RISCV/init-array.ll b/llvm/test/CodeGen/RISCV/init-array.ll new file mode 100644 index 0000000..1927eeb --- /dev/null +++ b/llvm/test/CodeGen/RISCV/init-array.ll @@ -0,0 +1,30 @@ +; RUN: llc -mtriple=riscv32-unknown-linux-gnu -verify-machineinstrs -o - %s \ +; RUN: | FileCheck --check-prefix=INITARRAY %s +; RUN: llc -mtriple=riscv32-unknown-elf -verify-machineinstrs -o - %s \ +; RUN: | FileCheck --check-prefix=INITARRAY %s +; RUN: llc -mtriple=riscv64-unknown-linux-gnu -verify-machineinstrs -o - %s \ +; RUN: | FileCheck --check-prefix=INITARRAY %s +; RUN: llc -mtriple=riscv64-unknown-elf -verify-machineinstrs -o - %s \ +; RUN: | FileCheck --check-prefix=INITARRAY %s + +; RUN: llc -mtriple=riscv32-unknown-linux-gnu -verify-machineinstrs -use-ctors -o - %s \ +; RUN: | FileCheck --check-prefix=CTOR %s +; RUN: llc -mtriple=riscv32-unknown-elf -verify-machineinstrs -use-ctors -o - %s \ +; RUN: | FileCheck --check-prefix=CTOR %s +; RUN: llc -mtriple=riscv64-unknown-linux-gnu -verify-machineinstrs -use-ctors -o - %s \ +; RUN: | FileCheck --check-prefix=CTOR %s +; RUN: llc -mtriple=riscv64-unknown-elf -verify-machineinstrs -use-ctors -o - %s \ +; RUN: | FileCheck --check-prefix=CTOR %s + +define internal void @_GLOBAL__I_a() section ".text.startup" { + ret void +} + +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] + +;INITARRAY: section .init_array +;INITARRAY-NOT: .section .ctors + +;CTOR: .section .ctors +;CTOR-NOT: section .init_array + -- 2.7.4