summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2010-11-09 19:40:22 +0000
committerJim Grosbach <grosbach@apple.com>2010-11-09 19:40:22 +0000
commit2fd4c37d8b401efb86dc17b7303fcdb781924770 (patch)
tree988e14de4603ded829014da816afb651003cc955 /llvm/lib/Target
parent4d94e47368b145ffc18c083a3df5a4df957f3e44 (diff)
downloadbcm5719-llvm-2fd4c37d8b401efb86dc17b7303fcdb781924770.tar.gz
bcm5719-llvm-2fd4c37d8b401efb86dc17b7303fcdb781924770.zip
Handle ARM constant pool values that need an explicit reference to the '.'
pseudo-label. (TLS stuff). llvm-svn: 118609
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/ARM/ARMAsmPrinter.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
index 5672bff7e94..30823d70187 100644
--- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/llvm/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 "(<expr> - .)", 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);
OpenPOWER on IntegriCloud