Index: lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp =================================================================== --- lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp +++ lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp @@ -305,7 +305,8 @@ bool CanUseLocalRelocation = canUseLocalRelocation(Section, *Symbol, Log2Size); - if (Symbol->isTemporary() && (Value || !CanUseLocalRelocation)) { + if (Symbol->isTemporary() && Symbol->isInSection() && + (Value || !CanUseLocalRelocation)) { const MCSection &Sec = Symbol->getSection(); if (!Asm.getContext().getAsmInfo()->isSectionAtomizableBySymbols(Sec)) Symbol->setUsedInReloc(); Index: test/MC/AArch64/arm64-no-section.ll =================================================================== --- /dev/null +++ test/MC/AArch64/arm64-no-section.ll @@ -0,0 +1,10 @@ +; RUN: llc -mtriple=aarch64-darwin-- -filetype=obj %s -o - +; CHECK: :1:2: error: unsupported relocation of local symbol +; CHECK-SAME: 'L_foo_end'. Must have non-local symbol earlier in section. + +; Make sure that we emit an error when we try to reference something that +; doesn't belong to a section. +define void @foo() local_unnamed_addr { + tail call void asm sideeffect "b L_foo_end\0A", ""() + ret void +}