[llvm] 500b4ad - [PowerPC] Fix downcast from nullptr for target streamer
QingShan Zhang via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 28 02:23:38 PDT 2020
Author: Ng Zhi An
Date: 2020-04-28T09:20:10Z
New Revision: 500b4ad5f4e5d5b712d00430ed96ac94a6207063
URL: https://github.com/llvm/llvm-project/commit/500b4ad5f4e5d5b712d00430ed96ac94a6207063
DIFF: https://github.com/llvm/llvm-project/commit/500b4ad5f4e5d5b712d00430ed96ac94a6207063.diff
LOG: [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
Added:
Modified:
llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
llvm/test/CodeGen/PowerPC/ppc64-toc.ll
llvm/test/MC/PowerPC/ppc-machine.s
llvm/test/MC/PowerPC/ppc64-abiversion.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
index 97dd969b8fe4..13fd7d05ab9f 100644
--- a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
+++ b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
@@ -1731,10 +1731,10 @@ bool PPCAsmParser::ParseDirectiveMachine(SMLoc L) {
if (parseToken(AsmToken::EndOfStatement))
return addErrorSuffix(" in '.machine' directive");
- PPCTargetStreamer &TStreamer =
- *static_cast<PPCTargetStreamer *>(
- getParser().getStreamer().getTargetStreamer());
- TStreamer.emitMachine(CPU);
+ PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
+ getParser().getStreamer().getTargetStreamer());
+ if (TStreamer != nullptr)
+ TStreamer->emitMachine(CPU);
return false;
}
@@ -1773,10 +1773,10 @@ bool PPCAsmParser::ParseDirectiveAbiVersion(SMLoc L) {
parseToken(AsmToken::EndOfStatement))
return addErrorSuffix(" in '.abiversion' directive");
- PPCTargetStreamer &TStreamer =
- *static_cast<PPCTargetStreamer *>(
- getParser().getStreamer().getTargetStreamer());
- TStreamer.emitAbiVersion(AbiVersion);
+ PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
+ getParser().getStreamer().getTargetStreamer());
+ if (TStreamer != nullptr)
+ TStreamer->emitAbiVersion(AbiVersion);
return false;
}
@@ -1796,10 +1796,10 @@ bool PPCAsmParser::ParseDirectiveLocalEntry(SMLoc L) {
parseToken(AsmToken::EndOfStatement))
return addErrorSuffix(" in '.localentry' directive");
- PPCTargetStreamer &TStreamer =
- *static_cast<PPCTargetStreamer *>(
- getParser().getStreamer().getTargetStreamer());
- TStreamer.emitLocalEntry(Sym, Expr);
+ PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>(
+ getParser().getStreamer().getTargetStreamer());
+ if (TStreamer != nullptr)
+ TStreamer->emitLocalEntry(Sym, Expr);
return false;
}
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 9f79182f518c..58dd3c73756d 100644
--- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -1396,8 +1396,8 @@ void PPCLinuxAsmPrinter::emitEndOfAsmFile(Module &M) {
bool isPPC64 = DL.getPointerSizeInBits() == 64;
- PPCTargetStreamer &TS =
- static_cast<PPCTargetStreamer &>(*OutStreamer->getTargetStreamer());
+ PPCTargetStreamer *TS =
+ static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
if (!TOC.empty()) {
const char *Name = isPPC64 ? ".toc" : ".got2";
@@ -1412,8 +1412,8 @@ void PPCLinuxAsmPrinter::emitEndOfAsmFile(Module &M) {
MCSymbol *const TOCEntryLabel = TOCMapPair.second;
OutStreamer->emitLabel(TOCEntryLabel);
- if (isPPC64)
- TS.emitTCEntry(*TOCEntryTarget);
+ if (isPPC64 && TS != nullptr)
+ TS->emitTCEntry(*TOCEntryTarget);
else
OutStreamer->emitSymbolValue(TOCEntryTarget, 4);
}
@@ -1687,8 +1687,8 @@ void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
// Switch to section to emit TOC base.
OutStreamer->SwitchSection(getObjFileLowering().getTOCBaseSection());
- PPCTargetStreamer &TS =
- static_cast<PPCTargetStreamer &>(*OutStreamer->getTargetStreamer());
+ PPCTargetStreamer *TS =
+ static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
const unsigned EntryByteSize = Subtarget->isPPC64() ? 8 : 4;
const unsigned TOCEntriesByteSize = TOC.size() * EntryByteSize;
@@ -1707,7 +1707,8 @@ void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
OutStreamer->SwitchSection(TCEntry);
OutStreamer->emitLabel(I.second);
- TS.emitTCEntry(*I.first);
+ if (TS != nullptr)
+ TS->emitTCEntry(*I.first);
}
}
diff --git a/llvm/test/CodeGen/PowerPC/ppc64-toc.ll b/llvm/test/CodeGen/PowerPC/ppc64-toc.ll
index 728f5c7765f8..121aa0975023 100644
--- a/llvm/test/CodeGen/PowerPC/ppc64-toc.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc64-toc.ll
@@ -1,4 +1,6 @@
; RUN: llc -verify-machineinstrs -code-model=small < %s | FileCheck %s
+; Test with null streamer.
+; RUN: llc -O0 -filetype=null < %s
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"
target triple = "powerpc64-unknown-linux-gnu"
diff --git a/llvm/test/MC/PowerPC/ppc-machine.s b/llvm/test/MC/PowerPC/ppc-machine.s
index 6b3bf3146cc7..119fde6f8df6 100644
--- a/llvm/test/MC/PowerPC/ppc-machine.s
+++ b/llvm/test/MC/PowerPC/ppc-machine.s
@@ -1,6 +1,7 @@
# RUN: llvm-mc -triple powerpc-unknown-unknown %s
# RUN: llvm-mc -triple powerpc64-unknown-unknown %s
# RUN: llvm-mc -triple powerpc64le-unknown-unknown %s
+# RUN: llvm-mc -triple powerpc64le-unknown-unknown -filetype=null %s
# For now, the only thing we check is that the .machine directive
# is accepted without syntax error.
diff --git a/llvm/test/MC/PowerPC/ppc64-abiversion.s b/llvm/test/MC/PowerPC/ppc64-abiversion.s
index d2970f8c9059..49d122772b8c 100644
--- a/llvm/test/MC/PowerPC/ppc64-abiversion.s
+++ b/llvm/test/MC/PowerPC/ppc64-abiversion.s
@@ -3,6 +3,7 @@
# RUN: llvm-readobj -h | FileCheck %s
# RUN: llvm-mc -triple powerpc64le-unknown-unknown -filetype=obj %s | \
# RUN: llvm-readobj -h | FileCheck %s
+# RUN: llvm-mc -triple powerpc64le-unknown-unknown -filetype=null %s
.abiversion 2
# CHECK: Flags [ (0x2)
More information about the llvm-commits
mailing list