diff options
Diffstat (limited to 'llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index edf361bc399..a65ddd478f4 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -5434,10 +5434,16 @@ AArch64AsmParser::classifySymbolRef(const MCExpr *Expr, // Check that it looks like a symbol + an addend MCValue Res; bool Relocatable = Expr->evaluateAsRelocatable(Res, nullptr, nullptr); - if (!Relocatable || !Res.getSymA() || Res.getSymB()) + if (!Relocatable || Res.getSymB()) return false; - DarwinRefKind = Res.getSymA()->getKind(); + // Treat expressions with an ELFRefKind (like ":abs_g1:3", or + // ":abs_g1:x" where x is constant) as symbolic even if there is no symbol. + if (!Res.getSymA() && ELFRefKind == AArch64MCExpr::VK_INVALID) + return false; + + if (Res.getSymA()) + DarwinRefKind = Res.getSymA()->getKind(); Addend = Res.getConstant(); // It's some symbol reference + a constant addend, but really |