Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions llvm/lib/Target/ARM/ARMAsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ void ARMAsmPrinter::emitXXStructor(const DataLayout &DL, const Constant *CV) {

const MCExpr *E = MCSymbolRefExpr::create(
GetARMGVSymbol(GV, ARMII::MO_NO_FLAG),
(Subtarget->isTargetELF() ? ARM::S_TARGET1 : ARM::S_None), OutContext);
(TM.getTargetTriple().isOSBinFormatELF() ? ARM::S_TARGET1 : ARM::S_None),
OutContext);

OutStreamer->emitValue(E, Size);
}
Expand Down Expand Up @@ -595,8 +596,7 @@ void ARMAsmPrinter::emitEndOfAsmFile(Module &M) {
ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);

if (OptimizationGoals > 0 &&
(Subtarget->isTargetAEABI() || Subtarget->isTargetGNUAEABI() ||
Subtarget->isTargetMuslAEABI()))
(TT.isTargetAEABI() || TT.isTargetGNUAEABI() || TT.isTargetMuslAEABI()))
ATS.emitAttribute(ARMBuildAttrs::ABI_optimization_goals, OptimizationGoals);
OptimizationGoals = -1;

Expand Down Expand Up @@ -884,9 +884,10 @@ static uint8_t getModifierSpecifier(ARMCP::ARMCPModifier Modifier) {

MCSymbol *ARMAsmPrinter::GetARMGVSymbol(const GlobalValue *GV,
unsigned char TargetFlags) {
if (Subtarget->isTargetMachO()) {
bool IsIndirect =
(TargetFlags & ARMII::MO_NONLAZY) && Subtarget->isGVIndirectSymbol(GV);
const Triple &TT = TM.getTargetTriple();
if (TT.isOSBinFormatMachO()) {
bool IsIndirect = (TargetFlags & ARMII::MO_NONLAZY) &&
ARMSubtarget::isGVIndirectSymbol(TM, GV);

if (!IsIndirect)
return getSymbol(GV);
Expand All @@ -903,9 +904,8 @@ MCSymbol *ARMAsmPrinter::GetARMGVSymbol(const GlobalValue *GV,
StubSym = MachineModuleInfoImpl::StubValueTy(getSymbol(GV),
!GV->hasInternalLinkage());
return MCSym;
} else if (Subtarget->isTargetCOFF()) {
assert(Subtarget->isTargetWindows() &&
"Windows is the only supported COFF target");
} else if (TT.isOSBinFormatCOFF()) {
assert(TT.isOSWindows() && "Windows is the only supported COFF target");

bool IsIndirect =
(TargetFlags & (ARMII::MO_DLLIMPORT | ARMII::MO_COFFSTUB));
Expand All @@ -932,7 +932,7 @@ MCSymbol *ARMAsmPrinter::GetARMGVSymbol(const GlobalValue *GV,
}

return MCSym;
} else if (Subtarget->isTargetELF()) {
} else if (TT.isOSBinFormatELF()) {
return getSymbolPreferLocal(*GV);
}
llvm_unreachable("unexpected target");
Expand Down Expand Up @@ -978,7 +978,8 @@ void ARMAsmPrinter::emitMachineConstantPoolValue(

// On Darwin, const-pool entries may get the "FOO$non_lazy_ptr" mangling, so
// flag the global as MO_NONLAZY.
unsigned char TF = Subtarget->isTargetMachO() ? ARMII::MO_NONLAZY : 0;
unsigned char TF =
TM.getTargetTriple().isOSBinFormatMachO() ? ARMII::MO_NONLAZY : 0;
MCSym = GetARMGVSymbol(GV, TF);
} else if (ACPV->isMachineBasicBlock()) {
const MachineBasicBlock *MBB = cast<ARMConstantPoolMBB>(ACPV)->getMBB();
Expand Down
9 changes: 7 additions & 2 deletions llvm/lib/Target/ARM/ARMSubtarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,20 +317,25 @@ bool ARMSubtarget::isRWPI() const {
TM.getRelocationModel() == Reloc::ROPI_RWPI;
}

bool ARMSubtarget::isGVIndirectSymbol(const GlobalValue *GV) const {
bool ARMSubtarget::isGVIndirectSymbol(const TargetMachine &TM,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please move this implementation into ARMTargetMachine.

const GlobalValue *GV) {
if (!TM.shouldAssumeDSOLocal(GV))
return true;

// 32 bit macho has no relocation for a-b if a is undefined, even if b is in
// the section that is being relocated. This means we have to use o load even
// for GVs that are known to be local to the dso.
if (isTargetMachO() && TM.isPositionIndependent() &&
if (TM.getTargetTriple().isOSBinFormatMachO() && TM.isPositionIndependent() &&
(GV->isDeclarationForLinker() || GV->hasCommonLinkage()))
return true;

return false;
}

bool ARMSubtarget::isGVIndirectSymbol(const GlobalValue *GV) const {
return isGVIndirectSymbol(TM, GV);
}

bool ARMSubtarget::isGVInGOT(const GlobalValue *GV) const {
return isTargetELF() && TM.isPositionIndependent() && !GV->isDSOLocal();
}
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/ARM/ARMSubtarget.h
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,8 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
}

/// True if the GV will be accessed via an indirect symbol.
static bool isGVIndirectSymbol(const TargetMachine &TM,
const GlobalValue *GV);
bool isGVIndirectSymbol(const GlobalValue *GV) const;

/// Returns the constant pool modifier needed to access the GV.
Expand Down
7 changes: 7 additions & 0 deletions llvm/test/CodeGen/ARM/xxstructor-nodef.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
; RUN: llc -mtriple=arm-unknown-linux-gnueabihf < %s | FileCheck %s

; This test contains a llvm.global_ctors with no other definitions. Make sure we do not crash in that case.
; CHECK: .section .init_array,"aw",%init_array

declare ccc void @ghczmbignum_GHCziNumziBackendziSelected_init__prof_init()
@llvm.global_ctors = appending global [1 x {i32, void ()*, i8* }] [{i32, void ()*, i8* }{i32 65535, void ()* @ghczmbignum_GHCziNumziBackendziSelected_init__prof_init, i8* null } ]
Loading