Skip to content

Commit f57d7d8

Browse files
author
Luke Cheeseman
committed
[AArch64] - Return address signing dwarf support
- Reapply changes intially introduced in r343089 - The archtecture info is no longer loaded whenever a DWARFContext is created - The runtimes libraries (santiziers) make use of the dwarf context classes but do not intialise the target info - The architecture of the object can be obtained without loading the target info - Adding a method to the dwarf context to get this information and multiplex the string printing later on Differential Revision: https://reviews.llvm.org/D55774 llvm-svn: 349472
1 parent ba8e84b commit f57d7d8

24 files changed

+193
-73
lines changed

llvm/include/llvm/BinaryFormat/Dwarf.def

+11-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
defined HANDLE_DW_VIRTUALITY || defined HANDLE_DW_DEFAULTED || \
1919
defined HANDLE_DW_CC || defined HANDLE_DW_LNS || defined HANDLE_DW_LNE || \
2020
defined HANDLE_DW_LNCT || defined HANDLE_DW_MACRO || \
21-
defined HANDLE_DW_RLE || defined HANDLE_DW_CFA || \
21+
defined HANDLE_DW_RLE || \
22+
(defined HANDLE_DW_CFA && defined HANDLE_DW_CFA_PRED) || \
2223
defined HANDLE_DW_APPLE_PROPERTY || defined HANDLE_DW_UT || \
2324
defined HANDLE_DWARF_SECTION || defined HANDLE_DW_IDX || \
2425
defined HANDLE_DW_END)
@@ -85,6 +86,10 @@
8586
#define HANDLE_DW_CFA(ID, NAME)
8687
#endif
8788

89+
#ifndef HANDLE_DW_CFA_PRED
90+
#define HANDLE_DW_CFA_PRED(ID, NAME, PRED)
91+
#endif
92+
8893
#ifndef HANDLE_DW_APPLE_PROPERTY
8994
#define HANDLE_DW_APPLE_PROPERTY(ID, NAME)
9095
#endif
@@ -831,9 +836,10 @@ HANDLE_DW_CFA(0x14, val_offset)
831836
HANDLE_DW_CFA(0x15, val_offset_sf)
832837
HANDLE_DW_CFA(0x16, val_expression)
833838
// Vendor extensions:
834-
HANDLE_DW_CFA(0x1d, MIPS_advance_loc8)
835-
HANDLE_DW_CFA(0x2d, GNU_window_save)
836-
HANDLE_DW_CFA(0x2e, GNU_args_size)
839+
HANDLE_DW_CFA_PRED(0x1d, MIPS_advance_loc8, SELECT_MIPS64)
840+
HANDLE_DW_CFA_PRED(0x2d, GNU_window_save, SELECT_SPARC)
841+
HANDLE_DW_CFA_PRED(0x2d, AARCH64_negate_ra_state, SELECT_AARCH64)
842+
HANDLE_DW_CFA_PRED(0x2e, GNU_args_size, SELECT_X86)
837843

838844
// Apple Objective-C Property Attributes.
839845
// Keep this list in sync with clang's DeclSpec.h ObjCPropertyAttributeKind!
@@ -916,6 +922,7 @@ HANDLE_DW_IDX(0x05, type_hash)
916922
#undef HANDLE_DW_MACRO
917923
#undef HANDLE_DW_RLE
918924
#undef HANDLE_DW_CFA
925+
#undef HANDLE_DW_CFA_PRED
919926
#undef HANDLE_DW_APPLE_PROPERTY
920927
#undef HANDLE_DW_UT
921928
#undef HANDLE_DWARF_SECTION

llvm/include/llvm/BinaryFormat/Dwarf.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "llvm/Support/ErrorHandling.h"
2727
#include "llvm/Support/Format.h"
2828
#include "llvm/Support/FormatVariadicDetails.h"
29+
#include "llvm/ADT/Triple.h"
2930

3031
namespace llvm {
3132
class StringRef;
@@ -272,6 +273,7 @@ enum RangeListEntries {
272273
/// Call frame instruction encodings.
273274
enum CallFrameInfo {
274275
#define HANDLE_DW_CFA(ID, NAME) DW_CFA_##NAME = ID,
276+
#define HANDLE_DW_CFA_PRED(ID, NAME, ARCH) DW_CFA_##NAME = ID,
275277
#include "llvm/BinaryFormat/Dwarf.def"
276278
DW_CFA_extended = 0x00,
277279

@@ -430,7 +432,7 @@ StringRef LNStandardString(unsigned Standard);
430432
StringRef LNExtendedString(unsigned Encoding);
431433
StringRef MacinfoString(unsigned Encoding);
432434
StringRef RangeListEncodingString(unsigned Encoding);
433-
StringRef CallFrameString(unsigned Encoding);
435+
StringRef CallFrameString(unsigned Encoding, Triple::ArchType Arch);
434436
StringRef ApplePropertyString(unsigned);
435437
StringRef UnitTypeString(unsigned);
436438
StringRef AtomTypeString(unsigned Atom);

llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h

+4
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,10 @@ class DWARFContext : public DIContext {
360360
/// Dump Error as warning message to stderr.
361361
static void dumpWarning(Error Warning);
362362

363+
Triple::ArchType getArch() const {
364+
return getDWARFObj().getFile()->getArch();
365+
}
366+
363367
private:
364368
/// Return the compile unit which contains instruction with provided
365369
/// address.

llvm/include/llvm/DebugInfo/DWARF/DWARFDebugFrame.h

+17-9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "llvm/ADT/ArrayRef.h"
1414
#include "llvm/ADT/iterator.h"
1515
#include "llvm/ADT/SmallString.h"
16+
#include "llvm/ADT/Triple.h"
1617
#include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
1718
#include "llvm/DebugInfo/DWARF/DWARFExpression.h"
1819
#include "llvm/Support/Error.h"
@@ -59,9 +60,11 @@ class CFIProgram {
5960
unsigned size() const { return (unsigned)Instructions.size(); }
6061
bool empty() const { return Instructions.empty(); }
6162

62-
CFIProgram(uint64_t CodeAlignmentFactor, int64_t DataAlignmentFactor)
63+
CFIProgram(uint64_t CodeAlignmentFactor, int64_t DataAlignmentFactor,
64+
Triple::ArchType Arch)
6365
: CodeAlignmentFactor(CodeAlignmentFactor),
64-
DataAlignmentFactor(DataAlignmentFactor) {}
66+
DataAlignmentFactor(DataAlignmentFactor),
67+
Arch(Arch) {}
6568

6669
/// Parse and store a sequence of CFI instructions from Data,
6770
/// starting at *Offset and ending at EndOffset. *Offset is updated
@@ -76,6 +79,7 @@ class CFIProgram {
7679
std::vector<Instruction> Instructions;
7780
const uint64_t CodeAlignmentFactor;
7881
const int64_t DataAlignmentFactor;
82+
Triple::ArchType Arch;
7983

8084
/// Convenience method to add a new instruction with the given opcode.
8185
void addInstruction(uint8_t Opcode) {
@@ -130,8 +134,9 @@ class FrameEntry {
130134
enum FrameKind { FK_CIE, FK_FDE };
131135

132136
FrameEntry(FrameKind K, uint64_t Offset, uint64_t Length, uint64_t CodeAlign,
133-
int64_t DataAlign)
134-
: Kind(K), Offset(Offset), Length(Length), CFIs(CodeAlign, DataAlign) {}
137+
int64_t DataAlign, Triple::ArchType Arch)
138+
: Kind(K), Offset(Offset), Length(Length),
139+
CFIs(CodeAlign, DataAlign, Arch) {}
135140

136141
virtual ~FrameEntry() {}
137142

@@ -168,9 +173,9 @@ class CIE : public FrameEntry {
168173
int64_t DataAlignmentFactor, uint64_t ReturnAddressRegister,
169174
SmallString<8> AugmentationData, uint32_t FDEPointerEncoding,
170175
uint32_t LSDAPointerEncoding, Optional<uint64_t> Personality,
171-
Optional<uint32_t> PersonalityEnc)
176+
Optional<uint32_t> PersonalityEnc, Triple::ArchType Arch)
172177
: FrameEntry(FK_CIE, Offset, Length, CodeAlignmentFactor,
173-
DataAlignmentFactor),
178+
DataAlignmentFactor, Arch),
174179
Version(Version), Augmentation(std::move(Augmentation)),
175180
AddressSize(AddressSize), SegmentDescriptorSize(SegmentDescriptorSize),
176181
CodeAlignmentFactor(CodeAlignmentFactor),
@@ -224,10 +229,11 @@ class FDE : public FrameEntry {
224229
// is obtained lazily once it's actually required.
225230
FDE(uint64_t Offset, uint64_t Length, int64_t LinkedCIEOffset,
226231
uint64_t InitialLocation, uint64_t AddressRange, CIE *Cie,
227-
Optional<uint64_t> LSDAAddress)
232+
Optional<uint64_t> LSDAAddress, Triple::ArchType Arch)
228233
: FrameEntry(FK_FDE, Offset, Length,
229234
Cie ? Cie->getCodeAlignmentFactor() : 0,
230-
Cie ? Cie->getDataAlignmentFactor() : 0),
235+
Cie ? Cie->getDataAlignmentFactor() : 0,
236+
Arch),
231237
LinkedCIEOffset(LinkedCIEOffset), InitialLocation(InitialLocation),
232238
AddressRange(AddressRange), LinkedCIE(Cie), LSDAAddress(LSDAAddress) {}
233239

@@ -256,6 +262,7 @@ class FDE : public FrameEntry {
256262

257263
/// A parsed .debug_frame or .eh_frame section
258264
class DWARFDebugFrame {
265+
const Triple::ArchType Arch;
259266
// True if this is parsing an eh_frame section.
260267
const bool IsEH;
261268
// Not zero for sane pointer values coming out of eh_frame
@@ -272,7 +279,8 @@ class DWARFDebugFrame {
272279
// it is a .debug_frame section. EHFrameAddress should be different
273280
// than zero for correct parsing of .eh_frame addresses when they
274281
// use a PC-relative encoding.
275-
DWARFDebugFrame(bool IsEH = false, uint64_t EHFrameAddress = 0);
282+
DWARFDebugFrame(Triple::ArchType Arch,
283+
bool IsEH = false, uint64_t EHFrameAddress = 0);
276284
~DWARFDebugFrame();
277285

278286
/// Dump the section data into the given stream.

llvm/include/llvm/MC/MCDwarf.h

+6
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ class MCCFIInstruction {
430430
OpUndefined,
431431
OpRegister,
432432
OpWindowSave,
433+
OpNegateRAState,
433434
OpGnuArgsSize
434435
};
435436

@@ -509,6 +510,11 @@ class MCCFIInstruction {
509510
return MCCFIInstruction(OpWindowSave, L, 0, 0, "");
510511
}
511512

513+
/// .cfi_negate_ra_state AArch64 negate RA state.
514+
static MCCFIInstruction createNegateRAState(MCSymbol *L) {
515+
return MCCFIInstruction(OpNegateRAState, L, 0, 0, "");
516+
}
517+
512518
/// .cfi_restore says that the rule for Register is now the same as it
513519
/// was at the beginning of the function, after all initial instructions added
514520
/// by .cfi_startproc were executed.

llvm/include/llvm/MC/MCStreamer.h

+1
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,7 @@ class MCStreamer {
900900
virtual void EmitCFIUndefined(int64_t Register);
901901
virtual void EmitCFIRegister(int64_t Register1, int64_t Register2);
902902
virtual void EmitCFIWindowSave();
903+
virtual void EmitCFINegateRAState();
903904

904905
virtual void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc = SMLoc());
905906
virtual void EmitWinCFIEndProc(SMLoc Loc = SMLoc());

llvm/lib/BinaryFormat/Dwarf.cpp

+20-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "llvm/BinaryFormat/Dwarf.h"
1515
#include "llvm/ADT/StringSwitch.h"
16+
#include "llvm/ADT/Triple.h"
1617
#include "llvm/Support/ErrorHandling.h"
1718

1819
using namespace llvm;
@@ -455,14 +456,32 @@ StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) {
455456
}
456457
}
457458

458-
StringRef llvm::dwarf::CallFrameString(unsigned Encoding) {
459+
StringRef llvm::dwarf::CallFrameString(unsigned Encoding,
460+
Triple::ArchType Arch) {
461+
assert(Arch != llvm::Triple::ArchType::UnknownArch);
462+
#define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64)
463+
#define SELECT_MIPS64 Arch == llvm::Triple::mips64
464+
#define SELECT_SPARC (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9)
465+
#define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64)
466+
#define HANDLE_DW_CFA(ID, NAME)
467+
#define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \
468+
if (ID == Encoding && PRED) \
469+
return "DW_CFA_" #NAME;
470+
#include "llvm/BinaryFormat/Dwarf.def"
471+
459472
switch (Encoding) {
460473
default:
461474
return StringRef();
475+
#define HANDLE_DW_CFA_PRED(ID, NAME, PRED)
462476
#define HANDLE_DW_CFA(ID, NAME) \
463477
case DW_CFA_##NAME: \
464478
return "DW_CFA_" #NAME;
465479
#include "llvm/BinaryFormat/Dwarf.def"
480+
481+
#undef SELECT_X86
482+
#undef SELECT_SPARC
483+
#undef SELECT_MIPS64
484+
#undef SELECT_AARCH64
466485
}
467486
}
468487

llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,9 @@ void AsmPrinter::emitCFIInstruction(const MCCFIInstruction &Inst) const {
212212
case MCCFIInstruction::OpWindowSave:
213213
OutStreamer->EmitCFIWindowSave();
214214
break;
215+
case MCCFIInstruction::OpNegateRAState:
216+
OutStreamer->EmitCFINegateRAState();
217+
break;
215218
case MCCFIInstruction::OpSameValue:
216219
OutStreamer->EmitCFISameValue(Inst.getRegister());
217220
break;

llvm/lib/CodeGen/CFIInstrInserter.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ void CFIInstrInserter::calculateOutgoingCFAInfo(MBBCFAInfo &MBBInfo) {
207207
case MCCFIInstruction::OpUndefined:
208208
case MCCFIInstruction::OpRegister:
209209
case MCCFIInstruction::OpWindowSave:
210+
case MCCFIInstruction::OpNegateRAState:
210211
case MCCFIInstruction::OpGnuArgsSize:
211212
break;
212213
}

llvm/lib/CodeGen/MIRParser/MILexer.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
220220
.Case("undefined", MIToken::kw_cfi_undefined)
221221
.Case("register", MIToken::kw_cfi_register)
222222
.Case("window_save", MIToken::kw_cfi_window_save)
223+
.Case("negate_ra_sign_state", MIToken::kw_cfi_aarch64_negate_ra_sign_state)
223224
.Case("blockaddress", MIToken::kw_blockaddress)
224225
.Case("intrinsic", MIToken::kw_intrinsic)
225226
.Case("target-index", MIToken::kw_target_index)

llvm/lib/CodeGen/MIRParser/MILexer.h

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ struct MIToken {
8989
kw_cfi_restore_state,
9090
kw_cfi_undefined,
9191
kw_cfi_window_save,
92+
kw_cfi_aarch64_negate_ra_sign_state,
9293
kw_blockaddress,
9394
kw_intrinsic,
9495
kw_target_index,

llvm/lib/CodeGen/MIRParser/MIParser.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -1931,6 +1931,9 @@ bool MIParser::parseCFIOperand(MachineOperand &Dest) {
19311931
case MIToken::kw_cfi_window_save:
19321932
CFIIndex = MF.addFrameInst(MCCFIInstruction::createWindowSave(nullptr));
19331933
break;
1934+
case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
1935+
CFIIndex = MF.addFrameInst(MCCFIInstruction::createNegateRAState(nullptr));
1936+
break;
19341937
case MIToken::kw_cfi_escape: {
19351938
std::string Values;
19361939
if (parseCFIEscapeValues(Values))
@@ -2223,6 +2226,7 @@ bool MIParser::parseMachineOperand(MachineOperand &Dest,
22232226
case MIToken::kw_cfi_restore_state:
22242227
case MIToken::kw_cfi_undefined:
22252228
case MIToken::kw_cfi_window_save:
2229+
case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
22262230
return parseCFIOperand(Dest);
22272231
case MIToken::kw_blockaddress:
22282232
return parseBlockAddressOperand(Dest);

llvm/lib/CodeGen/MachineOperand.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,11 @@ static void printCFI(raw_ostream &OS, const MCCFIInstruction &CFI,
697697
if (MCSymbol *Label = CFI.getLabel())
698698
MachineOperand::printSymbol(OS, *Label);
699699
break;
700+
case MCCFIInstruction::OpNegateRAState:
701+
OS << "negate_ra_sign_state ";
702+
if (MCSymbol *Label = CFI.getLabel())
703+
MachineOperand::printSymbol(OS, *Label);
704+
break;
700705
default:
701706
// TODO: Print the other CFI Operations.
702707
OS << "<unserializable cfi directive>";

llvm/lib/DebugInfo/DWARF/DWARFContext.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ const DWARFDebugFrame *DWARFContext::getDebugFrame() {
767767
// http://lists.dwarfstd.org/htdig.cgi/dwarf-discuss-dwarfstd.org/2011-December/001173.html
768768
DWARFDataExtractor debugFrameData(DObj->getDebugFrameSection(),
769769
isLittleEndian(), DObj->getAddressSize());
770-
DebugFrame.reset(new DWARFDebugFrame(false /* IsEH */));
770+
DebugFrame.reset(new DWARFDebugFrame(getArch(), false /* IsEH */));
771771
DebugFrame->parse(debugFrameData);
772772
return DebugFrame.get();
773773
}
@@ -778,7 +778,7 @@ const DWARFDebugFrame *DWARFContext::getEHFrame() {
778778

779779
DWARFDataExtractor debugFrameData(DObj->getEHFrameSection(), isLittleEndian(),
780780
DObj->getAddressSize());
781-
DebugFrame.reset(new DWARFDebugFrame(true /* IsEH */));
781+
DebugFrame.reset(new DWARFDebugFrame(getArch(), true /* IsEH */));
782782
DebugFrame->parse(debugFrameData);
783783
return DebugFrame.get();
784784
}

llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void CFIProgram::printOperand(raw_ostream &OS, const MCRegisterInfo *MRI,
225225
switch (Type) {
226226
case OT_Unset: {
227227
OS << " Unsupported " << (OperandIdx ? "second" : "first") << " operand to";
228-
auto OpcodeName = CallFrameString(Opcode);
228+
auto OpcodeName = CallFrameString(Opcode, Arch);
229229
if (!OpcodeName.empty())
230230
OS << " " << OpcodeName;
231231
else
@@ -279,7 +279,7 @@ void CFIProgram::dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH,
279279
if (Opcode & DWARF_CFI_PRIMARY_OPCODE_MASK)
280280
Opcode &= DWARF_CFI_PRIMARY_OPCODE_MASK;
281281
OS.indent(2 * IndentLevel);
282-
OS << CallFrameString(Opcode) << ":";
282+
OS << CallFrameString(Opcode, Arch) << ":";
283283
for (unsigned i = 0; i < Instr.Ops.size(); ++i)
284284
printOperand(OS, MRI, IsEH, Instr, i, Instr.Ops[i]);
285285
OS << '\n';
@@ -325,8 +325,9 @@ void FDE::dump(raw_ostream &OS, const MCRegisterInfo *MRI, bool IsEH) const {
325325
OS << "\n";
326326
}
327327

328-
DWARFDebugFrame::DWARFDebugFrame(bool IsEH, uint64_t EHFrameAddress)
329-
: IsEH(IsEH), EHFrameAddress(EHFrameAddress) {}
328+
DWARFDebugFrame::DWARFDebugFrame(Triple::ArchType Arch,
329+
bool IsEH, uint64_t EHFrameAddress)
330+
: Arch(Arch), IsEH(IsEH), EHFrameAddress(EHFrameAddress) {}
330331

331332
DWARFDebugFrame::~DWARFDebugFrame() = default;
332333

@@ -461,7 +462,7 @@ void DWARFDebugFrame::parse(DWARFDataExtractor Data) {
461462
StartOffset, Length, Version, AugmentationString, AddressSize,
462463
SegmentDescriptorSize, CodeAlignmentFactor, DataAlignmentFactor,
463464
ReturnAddressRegister, AugmentationData, FDEPointerEncoding,
464-
LSDAPointerEncoding, Personality, PersonalityEncoding);
465+
LSDAPointerEncoding, Personality, PersonalityEncoding, Arch);
465466
CIEs[StartOffset] = Cie.get();
466467
Entries.emplace_back(std::move(Cie));
467468
} else {
@@ -513,7 +514,7 @@ void DWARFDebugFrame::parse(DWARFDataExtractor Data) {
513514

514515
Entries.emplace_back(new FDE(StartOffset, Length, CIEPointer,
515516
InitialLocation, AddressRange,
516-
Cie, LSDAAddress));
517+
Cie, LSDAAddress, Arch));
517518
}
518519

519520
if (Error E =

llvm/lib/MC/MCAsmStreamer.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ class MCAsmStreamer final : public MCStreamer {
285285
void EmitCFIUndefined(int64_t Register) override;
286286
void EmitCFIRegister(int64_t Register1, int64_t Register2) override;
287287
void EmitCFIWindowSave() override;
288+
void EmitCFINegateRAState() override;
288289
void EmitCFIReturnColumn(int64_t Register) override;
289290

290291
void EmitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc) override;
@@ -1586,6 +1587,12 @@ void MCAsmStreamer::EmitCFIWindowSave() {
15861587
EmitEOL();
15871588
}
15881589

1590+
void MCAsmStreamer::EmitCFINegateRAState() {
1591+
MCStreamer::EmitCFINegateRAState();
1592+
OS << "\t.cfi_negate_ra_state";
1593+
EmitEOL();
1594+
}
1595+
15891596
void MCAsmStreamer::EmitCFIReturnColumn(int64_t Register) {
15901597
MCStreamer::EmitCFIReturnColumn(Register);
15911598
OS << "\t.cfi_return_column " << Register;

llvm/lib/MC/MCDwarf.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,10 @@ void FrameEmitterImpl::EmitCFIInstruction(const MCCFIInstruction &Instr) {
13321332
Streamer.EmitIntValue(dwarf::DW_CFA_GNU_window_save, 1);
13331333
return;
13341334

1335+
case MCCFIInstruction::OpNegateRAState:
1336+
Streamer.EmitIntValue(dwarf::DW_CFA_AARCH64_negate_ra_state, 1);
1337+
return;
1338+
13351339
case MCCFIInstruction::OpUndefined: {
13361340
unsigned Reg = Instr.getRegister();
13371341
Streamer.EmitIntValue(dwarf::DW_CFA_undefined, 1);

0 commit comments

Comments
 (0)