diff options
| author | Marcin Koscielnicki <koriakin@0x04.net> | 2016-04-28 21:24:37 +0000 |
|---|---|---|
| committer | Marcin Koscielnicki <koriakin@0x04.net> | 2016-04-28 21:24:37 +0000 |
| commit | 7b32957852475e460a9434ee903989bd4291aeaa (patch) | |
| tree | 384c3e6101d1321cdb5135d514173eec09df7e92 /llvm/lib/Target/PowerPC | |
| parent | de8d3753d30534d1c0df2591bc306981b50ec246 (diff) | |
| download | bcm5719-llvm-7b32957852475e460a9434ee903989bd4291aeaa.tar.gz bcm5719-llvm-7b32957852475e460a9434ee903989bd4291aeaa.zip | |
[PowerPC] Fix the EH_SjLj_Setup pseudo.
This instruction is just a control flow marker - it should not
actually exist in the object file. Unfortunately, nothing catches
it before it gets to AsmPrinter. If integrated assembler is used,
it's considered to be a normal 4-byte instruction, and emitted as
an all-0 word, crashing the program. With external assembler,
a comment is emitted.
Fixed by setting Size to 0 and handling it in MCCodeEmitter - this
means the comment will still be emitted if integrated assembler
is not used.
This broke an ASan test, which has been disabled for a long time
as a result (see the discussion on D19657). We can reenable it
once this lands.
llvm-svn: 267943
Diffstat (limited to 'llvm/lib/Target/PowerPC')
| -rw-r--r-- | llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCInstrInfo.td | 5 |
2 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp index 0f6385e0a67..e7b2d8369f2 100644 --- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp +++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp @@ -113,6 +113,8 @@ public: // Output the constant in big/little endian byte order. unsigned Size = Desc.getSize(); switch (Size) { + case 0: + break; case 4: if (IsLittleEndian) { support::endian::Writer<support::little>(OS).write<uint32_t>(Bits); diff --git a/llvm/lib/Target/PowerPC/PPCInstrInfo.td b/llvm/lib/Target/PowerPC/PPCInstrInfo.td index 32558d35513..838889660a3 100644 --- a/llvm/lib/Target/PowerPC/PPCInstrInfo.td +++ b/llvm/lib/Target/PowerPC/PPCInstrInfo.td @@ -1397,7 +1397,10 @@ let hasSideEffects = 1, isBarrier = 1, usesCustomInserter = 1 in { Requires<[In32BitMode]>; } -let isBranch = 1, isTerminator = 1 in { +// This pseudo is never removed from the function, as it serves as +// a terminator. Size is set to 0 to prevent the builtin assembler +// from emitting it. +let isBranch = 1, isTerminator = 1, Size = 0 in { def EH_SjLj_Setup : Pseudo<(outs), (ins directbrtarget:$dst), "#EH_SjLj_Setup\t$dst", []>; } |

