[RISCV] RISCVELFTargetObjectFile: use 2-byte alignment for .text if RVC
authorFangrui Song <i@maskray.me>
Thu, 11 May 2023 20:44:37 +0000 (13:44 -0700)
committerFangrui Song <i@maskray.me>
Thu, 11 May 2023 20:44:37 +0000 (13:44 -0700)
For the "C" Standard Extension/Zca, D45560 enabled 2-byte alignment for
assembly output (e.g. `clang -S a.c`) and D102052 enabled 2-byte alignment for
assembly input and object file output (e.g. `clang -c a.s`).

This patch ports the behavior for code generation and object file output by
adding RISCVELFTargetObjectFile::getTextSectionAlignment (e.g. `clang -c a.c`).

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D150240

llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.cpp
llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCObjectFileInfo.h
llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
llvm/lib/Target/RISCV/RISCVTargetObjectFile.h
llvm/test/CodeGen/RISCV/align.ll

index 6118d0d..ac7d3b7 100644 (file)
 
 using namespace llvm;
 
+unsigned
+RISCVMCObjectFileInfo::getTextSectionAlignment(const MCSubtargetInfo &STI) {
+  bool RVC = STI.hasFeature(RISCV::FeatureStdExtC) ||
+             STI.hasFeature(RISCV::FeatureStdExtZca);
+  return RVC ? 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());
 }
index ee686ba..c2ef160 100644 (file)
 #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;
 };
 
index 1d80ea4..7c9e57e 100644 (file)
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "RISCVTargetObjectFile.h"
+#include "MCTargetDesc/RISCVMCObjectFileInfo.h"
 #include "RISCVTargetMachine.h"
 #include "llvm/BinaryFormat/ELF.h"
 #include "llvm/MC/MCContext.h"
 
 using namespace llvm;
 
+unsigned RISCVELFTargetObjectFile::getTextSectionAlignment() const {
+  return RISCVMCObjectFileInfo::getTextSectionAlignment(
+      *getContext().getSubtargetInfo());
+}
+
 void RISCVELFTargetObjectFile::Initialize(MCContext &Ctx,
                                           const TargetMachine &TM) {
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
index 659ad40..890effd 100644 (file)
@@ -20,6 +20,8 @@ class RISCVELFTargetObjectFile : public TargetLoweringObjectFileELF {
   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
index f044f3b..5807fc1 100644 (file)
@@ -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