1
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h
2
index 9932306..948caa8 100644
3
--- a/include/llvm/MC/MCStreamer.h
4
+++ b/include/llvm/MC/MCStreamer.h
5
@@ -116,7 +116,7 @@ namespace llvm {
9
- ArrayRef<MCDwarfFrameInfo> getFrameInfos() {
10
+ MutableArrayRef<MCDwarfFrameInfo> getFrameInfos() {
14
diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp
15
index e16f7ae..edf1d6d 100644
16
--- a/lib/MC/MCDwarf.cpp
17
+++ b/lib/MC/MCDwarf.cpp
18
@@ -859,7 +859,6 @@ namespace {
19
const MCSymbol &EmitCIE(MCStreamer &streamer,
20
const MCSymbol *personality,
21
unsigned personalityEncoding,
22
- const MCSymbol *lsda,
24
unsigned lsdaEncoding);
25
MCSymbol *EmitFDE(MCStreamer &streamer,
26
@@ -1131,7 +1130,6 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
27
const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
28
const MCSymbol *personality,
29
unsigned personalityEncoding,
30
- const MCSymbol *lsda,
32
unsigned lsdaEncoding) {
33
MCContext &context = streamer.getContext();
34
@@ -1172,7 +1170,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
43
@@ -1203,7 +1201,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
45
augmentationLength += getSizeForEncoding(streamer, personalityEncoding);
49
augmentationLength += 1;
50
// Encoding of the FDE pointers
51
augmentationLength += 1;
52
@@ -1221,7 +1219,7 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
53
EmitPersonality(streamer, *personality, personalityEncoding);
58
EmitEncodingByte(streamer, lsdaEncoding, "LSDA Encoding");
60
// Encoding of the FDE pointers
61
@@ -1322,6 +1320,8 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
63
EmitSymbol(streamer, *frame.Lsda, frame.LsdaEncoding,
64
"Language Specific Data Area");
65
+ else if (frame.LsdaEncoding)
66
+ streamer.EmitIntValue(0, 4);
69
// Call Frame Instructions
70
@@ -1385,7 +1385,7 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
71
MCObjectFileInfo *MOFI =
72
const_cast<MCObjectFileInfo*>(Context.getObjectFileInfo());
73
FrameEmitterImpl Emitter(UsingCFI, IsEH);
74
- ArrayRef<MCDwarfFrameInfo> FrameArray = Streamer.getFrameInfos();
75
+ MutableArrayRef<MCDwarfFrameInfo> FrameArray = Streamer.getFrameInfos();
77
// Emit the compact unwind info if available.
78
if (IsEH && MOFI->getCompactUnwindSection())
79
@@ -1405,7 +1405,31 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
80
MCSymbol *FDEEnd = NULL;
81
DenseMap<CIEKey, const MCSymbol*> CIEStarts;
83
- const MCSymbol *DummyDebugKey = NULL;
85
+ const MCSymbol *HackPersonality = NULL;
86
+ unsigned HackLsdaEncoding = 0;
87
+ unsigned HackPersonalityEncoding = 0;
88
+ for (unsigned i = 0, n = FrameArray.size(); i < n; ++i) {
89
+ const MCDwarfFrameInfo &Frame = FrameArray[i];
90
+ if (!HackPersonality)
91
+ HackPersonality = Frame.Personality;
92
+ if (!HackLsdaEncoding)
93
+ HackLsdaEncoding = Frame.LsdaEncoding;
94
+ if (!HackPersonalityEncoding)
95
+ HackPersonalityEncoding = Frame.PersonalityEncoding;
98
+ for (unsigned i = 0, n = FrameArray.size(); i < n; ++i) {
99
+ MCDwarfFrameInfo &Frame = FrameArray[i];
100
+ assert(Frame.Personality == NULL || Frame.Personality == HackPersonality);
101
+ Frame.Personality = HackPersonality;
102
+ assert(Frame.LsdaEncoding == 0 || Frame.LsdaEncoding == HackLsdaEncoding);
103
+ Frame.LsdaEncoding = HackLsdaEncoding;
104
+ assert(Frame.PersonalityEncoding == 0 || Frame.PersonalityEncoding == HackPersonalityEncoding);
105
+ Frame.PersonalityEncoding = HackPersonalityEncoding;
108
+ const MCSymbol *DummyDebugKey = NULL;
109
for (unsigned i = 0, n = FrameArray.size(); i < n; ++i) {
110
const MCDwarfFrameInfo &Frame = FrameArray[i];
111
CIEKey Key(Frame.Personality, Frame.PersonalityEncoding,
112
@@ -1413,7 +1437,7 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
113
const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
115
CIEStart = &Emitter.EmitCIE(Streamer, Frame.Personality,
116
- Frame.PersonalityEncoding, Frame.Lsda,
117
+ Frame.PersonalityEncoding,