From c9962aca8f2f2c51794996ac1e2b7731d1d1d497 Mon Sep 17 00:00:00 2001 From: Jim Grosbach Date: Tue, 9 Nov 2010 19:40:22 +0000 Subject: [PATCH] Handle ARM constant pool values that need an explicit reference to the '.' pseudo-label. (TLS stuff). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118609 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMAsmPrinter.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 5672bff7e94..30823d70187 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -666,7 +666,7 @@ EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { Twine Text(DataDirective, OS.str()); OutStreamer.EmitRawText(Text); } else { - assert(!ACPV->hasModifier() && !ACPV->mustAddCurrentAddress() && + assert(!ACPV->hasModifier() && "ARM binary streamer of non-trivial constant pool value!"); if (ACPV->getPCAdjustment()) { MCSymbol *PCLabel = getPICLabel(MAI->getPrivateGlobalPrefix(), @@ -679,6 +679,14 @@ EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { MCConstantExpr::Create(ACPV->getPCAdjustment(), OutContext), OutContext); + if (ACPV->mustAddCurrentAddress()) { + // We want "( - .)", but MC doesn't have a concept of the '.' + // label, so just emit a local label end reference that instead. + MCSymbol *DotSym = OutContext.CreateTempSymbol(); + OutStreamer.EmitLabel(DotSym); + const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext); + Expr = MCBinaryExpr::CreateSub(Expr, DotExpr, OutContext); + } Expr = MCBinaryExpr::CreateSub(Expr, PCRelExpr, OutContext); } OutStreamer.EmitValue(Expr, Size);