Skip to content

Commit 500b4ad

Browse files
ngzhianQingShan Zhang
authored and
QingShan Zhang
committed
[PowerPC] Fix downcast from nullptr for target streamer
getTargetStreamer() might return null (e.g. when running inlined-strings.ll test), downcasting to a reference will be wrong. This is detectable with -fsanitize=null. Reviewed By: steven.zhang Differential Revision: https://reviews.llvm.org/D78686
1 parent 949018c commit 500b4ad

File tree

5 files changed

+24
-19
lines changed

5 files changed

+24
-19
lines changed

llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1731,10 +1731,10 @@ bool PPCAsmParser::ParseDirectiveMachine(SMLoc L) {
17311731
if (parseToken(AsmToken::EndOfStatement))
17321732
return addErrorSuffix(" in '.machine' directive");
17331733

1734-
PPCTargetStreamer &TStreamer =
1735-
*static_cast<PPCTargetStreamer *>(
1736-
getParser().getStreamer().getTargetStreamer());
1737-
TStreamer.emitMachine(CPU);
1734+
PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
1735+
getParser().getStreamer().getTargetStreamer());
1736+
if (TStreamer != nullptr)
1737+
TStreamer->emitMachine(CPU);
17381738

17391739
return false;
17401740
}
@@ -1773,10 +1773,10 @@ bool PPCAsmParser::ParseDirectiveAbiVersion(SMLoc L) {
17731773
parseToken(AsmToken::EndOfStatement))
17741774
return addErrorSuffix(" in '.abiversion' directive");
17751775

1776-
PPCTargetStreamer &TStreamer =
1777-
*static_cast<PPCTargetStreamer *>(
1778-
getParser().getStreamer().getTargetStreamer());
1779-
TStreamer.emitAbiVersion(AbiVersion);
1776+
PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
1777+
getParser().getStreamer().getTargetStreamer());
1778+
if (TStreamer != nullptr)
1779+
TStreamer->emitAbiVersion(AbiVersion);
17801780

17811781
return false;
17821782
}
@@ -1796,10 +1796,10 @@ bool PPCAsmParser::ParseDirectiveLocalEntry(SMLoc L) {
17961796
parseToken(AsmToken::EndOfStatement))
17971797
return addErrorSuffix(" in '.localentry' directive");
17981798

1799-
PPCTargetStreamer &TStreamer =
1800-
*static_cast<PPCTargetStreamer *>(
1801-
getParser().getStreamer().getTargetStreamer());
1802-
TStreamer.emitLocalEntry(Sym, Expr);
1799+
PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
1800+
getParser().getStreamer().getTargetStreamer());
1801+
if (TStreamer != nullptr)
1802+
TStreamer->emitLocalEntry(Sym, Expr);
18031803

18041804
return false;
18051805
}

llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,8 +1396,8 @@ void PPCLinuxAsmPrinter::emitEndOfAsmFile(Module &M) {
13961396

13971397
bool isPPC64 = DL.getPointerSizeInBits() == 64;
13981398

1399-
PPCTargetStreamer &TS =
1400-
static_cast<PPCTargetStreamer &>(*OutStreamer->getTargetStreamer());
1399+
PPCTargetStreamer *TS =
1400+
static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
14011401

14021402
if (!TOC.empty()) {
14031403
const char *Name = isPPC64 ? ".toc" : ".got2";
@@ -1412,8 +1412,8 @@ void PPCLinuxAsmPrinter::emitEndOfAsmFile(Module &M) {
14121412
MCSymbol *const TOCEntryLabel = TOCMapPair.second;
14131413

14141414
OutStreamer->emitLabel(TOCEntryLabel);
1415-
if (isPPC64)
1416-
TS.emitTCEntry(*TOCEntryTarget);
1415+
if (isPPC64 && TS != nullptr)
1416+
TS->emitTCEntry(*TOCEntryTarget);
14171417
else
14181418
OutStreamer->emitSymbolValue(TOCEntryTarget, 4);
14191419
}
@@ -1687,8 +1687,8 @@ void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
16871687
// Switch to section to emit TOC base.
16881688
OutStreamer->SwitchSection(getObjFileLowering().getTOCBaseSection());
16891689

1690-
PPCTargetStreamer &TS =
1691-
static_cast<PPCTargetStreamer &>(*OutStreamer->getTargetStreamer());
1690+
PPCTargetStreamer *TS =
1691+
static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
16921692

16931693
const unsigned EntryByteSize = Subtarget->isPPC64() ? 8 : 4;
16941694
const unsigned TOCEntriesByteSize = TOC.size() * EntryByteSize;
@@ -1707,7 +1707,8 @@ void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
17071707
OutStreamer->SwitchSection(TCEntry);
17081708

17091709
OutStreamer->emitLabel(I.second);
1710-
TS.emitTCEntry(*I.first);
1710+
if (TS != nullptr)
1711+
TS->emitTCEntry(*I.first);
17111712
}
17121713
}
17131714

llvm/test/CodeGen/PowerPC/ppc64-toc.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
; RUN: llc -verify-machineinstrs -code-model=small < %s | FileCheck %s
2+
; Test with null streamer.
3+
; RUN: llc -O0 -filetype=null < %s
24
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
35
target triple = "powerpc64-unknown-linux-gnu"
46

llvm/test/MC/PowerPC/ppc-machine.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# RUN: llvm-mc -triple powerpc-unknown-unknown %s
22
# RUN: llvm-mc -triple powerpc64-unknown-unknown %s
33
# RUN: llvm-mc -triple powerpc64le-unknown-unknown %s
4+
# RUN: llvm-mc -triple powerpc64le-unknown-unknown -filetype=null %s
45

56
# For now, the only thing we check is that the .machine directive
67
# is accepted without syntax error.

llvm/test/MC/PowerPC/ppc64-abiversion.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# RUN: llvm-readobj -h | FileCheck %s
44
# RUN: llvm-mc -triple powerpc64le-unknown-unknown -filetype=obj %s | \
55
# RUN: llvm-readobj -h | FileCheck %s
6+
# RUN: llvm-mc -triple powerpc64le-unknown-unknown -filetype=null %s
67

78
.abiversion 2
89
# CHECK: Flags [ (0x2)

0 commit comments

Comments
 (0)