diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.h b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.h --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.h +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.h @@ -14,11 +14,13 @@ #define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVMCOBJECTFILEINFO_H #include "llvm/MC/MCObjectFileInfo.h" +#include "llvm/MC/MCSubtargetInfo.h" namespace llvm { class RISCVMCObjectFileInfo : public MCObjectFileInfo { public: + static unsigned getTextSectionAlignment(const MCSubtargetInfo &STI); unsigned getTextSectionAlignment() const override; }; diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.cpp @@ -12,15 +12,17 @@ #include "RISCVMCObjectFileInfo.h" #include "RISCVMCTargetDesc.h" +#include "RISCVSubtarget.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSubtargetInfo.h" using namespace llvm; +unsigned +RISCVMCObjectFileInfo::getTextSectionAlignment(const MCSubtargetInfo &STI) { + return static_cast(STI).hasStdExtCOrZca() ? 2 : 4; +} + unsigned RISCVMCObjectFileInfo::getTextSectionAlignment() const { - const MCSubtargetInfo *STI = getContext().getSubtargetInfo(); - return (STI->hasFeature(RISCV::FeatureStdExtC) || - STI->hasFeature(RISCV::FeatureStdExtZca)) - ? 2 - : 4; + return getTextSectionAlignment(*getContext().getSubtargetInfo()); } diff --git a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.h b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.h --- a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.h +++ b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.h @@ -20,6 +20,8 @@ unsigned SSThreshold = 8; public: + unsigned getTextSectionAlignment() const override; + void Initialize(MCContext &Ctx, const TargetMachine &TM) override; /// Return true if this global address should be placed into small data/bss diff --git a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp --- a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "RISCVTargetObjectFile.h" +#include "MCTargetDesc/RISCVMCObjectFileInfo.h" #include "RISCVTargetMachine.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/MCContext.h" @@ -14,6 +15,11 @@ using namespace llvm; +unsigned RISCVELFTargetObjectFile::getTextSectionAlignment() const { + return RISCVMCObjectFileInfo::getTextSectionAlignment( + *getContext().getSubtargetInfo()); +} + void RISCVELFTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) { TargetLoweringObjectFileELF::Initialize(Ctx, TM); diff --git a/llvm/test/CodeGen/RISCV/align.ll b/llvm/test/CodeGen/RISCV/align.ll --- a/llvm/test/CodeGen/RISCV/align.ll +++ b/llvm/test/CodeGen/RISCV/align.ll @@ -2,6 +2,14 @@ ; RUN: | FileCheck %s -check-prefix=RV32I ; RUN: llc -mtriple=riscv32 -mattr=+c -verify-machineinstrs < %s \ ; RUN: | FileCheck %s -check-prefix=RV32C +; RUN: llc -filetype=obj -mtriple=riscv32 < %s -o %t +; RUN: llvm-readelf -S %t | FileCheck %s --check-prefixes=SEC,SEC-I +; RUN: llc -filetype=obj -mtriple=riscv32 -mattr=+c < %s -o %t +; RUN: llvm-readelf -S %t | FileCheck %s --check-prefixes=SEC,SEC-C + +; SEC: Name Type Address Off Size ES Flg Lk Inf Al +; SEC-I: .text PROGBITS 00000000 [[#%x,]] [[#%x,]] 00 AX 0 0 4 +; SEC-C: .text PROGBITS 00000000 [[#%x,]] [[#%x,]] 00 AX 0 0 2 define void @foo() { ;RV32I: .p2align 2