
D57497 added -msmall-data-limit= as an alias for -G and defaulted it to 8 for -fno-pic/-fpie. The behavior is already different from GCC in a few ways: * GCC doesn't accept -G. * GCC -fpie doesn't seem to use -msmall-data-limit=. * GCC emits .srodata.cst* that we don't use (#82214). Writable contents caused confusion (https://bugs.chromium.org/p/llvm/issues/detail?id=61) In addition, * claiming `-shared` means we don't get a desired `-Wunused-command-line-argument` for `clang --target=riscv64-linux-gnu -fpic -c -shared a.c`. * -mcmodel=large doesn't work for RISC-V yet, so the special case is strange. * It's quite unusual to emit a warning when an option (unrelated to relocation model) is used with -fpic. * We don't want future configurations (Android) to continue adding customization to `SetRISCVSmallDataLimit`. I believe the extra code just doesn't pull its weight and should be cleaned up. This patch also changes the default to 0. GP relaxation users are encouraged to specify these customization options explicitly. Pull Request: https://github.com/llvm/llvm-project/pull/83093
61 lines
2.2 KiB
C++
61 lines
2.2 KiB
C++
//===-- RISCVTargetObjectFile.h - RISC-V Object Info ------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_RISCV_RISCVTARGETOBJECTFILE_H
|
|
#define LLVM_LIB_TARGET_RISCV_RISCVTARGETOBJECTFILE_H
|
|
|
|
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// This implementation is used for RISC-V ELF targets.
|
|
class RISCVELFTargetObjectFile : public TargetLoweringObjectFileELF {
|
|
MCSection *SmallDataSection;
|
|
MCSection *SmallRODataSection;
|
|
MCSection *SmallROData4Section;
|
|
MCSection *SmallROData8Section;
|
|
MCSection *SmallROData16Section;
|
|
MCSection *SmallROData32Section;
|
|
MCSection *SmallBSSSection;
|
|
unsigned SSThreshold = 0;
|
|
|
|
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
|
|
/// section.
|
|
bool isGlobalInSmallSection(const GlobalObject *GO,
|
|
const TargetMachine &TM) const;
|
|
|
|
MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,
|
|
const TargetMachine &TM) const override;
|
|
|
|
/// Return true if this constant should be placed into small data section.
|
|
bool isConstantInSmallSection(const DataLayout &DL, const Constant *CN) const;
|
|
|
|
MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
|
|
const Constant *C,
|
|
Align &Alignment) const override;
|
|
|
|
void getModuleMetadata(Module &M) override;
|
|
|
|
bool isInSmallSection(uint64_t Size) const;
|
|
|
|
const MCExpr *getIndirectSymViaGOTPCRel(const GlobalValue *GV,
|
|
const MCSymbol *Sym,
|
|
const MCValue &MV, int64_t Offset,
|
|
MachineModuleInfo *MMI,
|
|
MCStreamer &Streamer) const override;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|