Skip to content

Commit fce7f73

Browse files
committedAug 9, 2018
[MC] Move EH DWARF encodings from MC to CodeGen, NFC
Summary: The TType encoding, LSDA encoding, and personality encoding are all passed explicitly by CodeGen to the assembler through .cfi_* directives, so only the AsmPrinter needs to know about them. The FDE CFI encoding however, controls the encoding of the label implicitly created by the .cfi_startproc directive. That directive seems to be special in that it doesn't take an encoding, so the assembler just has to know how to encode one DSO-local label reference from .eh_frame to .text. As a result, it looks like MC will continue to have to know when the large code model is in use. Perhaps we could invent a '.cfi_startproc [large]' flag so that this knowledge doesn't need to pollute the assembler. Reviewers: davide, lliu0, JDevlieghere Subscribers: hiraditya, fedor.sergeev, llvm-commits Differential Revision: https://reviews.llvm.org/D50533 llvm-svn: 339397
1 parent c6944f7 commit fce7f73

File tree

5 files changed

+179
-166
lines changed

5 files changed

+179
-166
lines changed
 

‎llvm/include/llvm/MC/MCObjectFileInfo.h

+5-9
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,11 @@ class MCObjectFileInfo {
4242
/// dwarf unwind.
4343
bool OmitDwarfIfHaveCompactUnwind;
4444

45-
/// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values
46-
/// for EH.
47-
unsigned PersonalityEncoding;
48-
unsigned LSDAEncoding;
49-
unsigned FDECFIEncoding;
50-
unsigned TTypeEncoding;
45+
/// FDE CFI encoding. Controls the encoding of the begin label in the
46+
/// .eh_frame section. Unlike the LSDA encoding, personality encoding, and
47+
/// type encodings, this is something that the assembler just "knows" about
48+
/// its target
49+
unsigned FDECFIEncoding = 0;
5150

5251
/// Compact unwind encoding indicating that we should emit only an EH frame.
5352
unsigned CompactUnwindDwarfEHFrameOnly;
@@ -226,10 +225,7 @@ class MCObjectFileInfo {
226225
return CommDirectiveSupportsAlignment;
227226
}
228227

229-
unsigned getPersonalityEncoding() const { return PersonalityEncoding; }
230-
unsigned getLSDAEncoding() const { return LSDAEncoding; }
231228
unsigned getFDEEncoding() const { return FDECFIEncoding; }
232-
unsigned getTTypeEncoding() const { return TTypeEncoding; }
233229

234230
unsigned getCompactUnwindDwarfEHFrameOnly() const {
235231
return CompactUnwindDwarfEHFrameOnly;

‎llvm/include/llvm/Target/TargetLoweringObjectFile.h

+10
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ class TargetLoweringObjectFile : public MCObjectFileInfo {
4747
bool SupportGOTPCRelWithOffset = true;
4848
bool SupportDebugThreadLocalLocation = true;
4949

50+
/// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values
51+
/// for EH.
52+
unsigned PersonalityEncoding = 0;
53+
unsigned LSDAEncoding = 0;
54+
unsigned TTypeEncoding = 0;
55+
5056
/// This section contains the static constructor pointer list.
5157
MCSection *StaticCtorSection = nullptr;
5258

@@ -136,6 +142,10 @@ class TargetLoweringObjectFile : public MCObjectFileInfo {
136142
const TargetMachine &TM,
137143
MachineModuleInfo *MMI) const;
138144

145+
unsigned getPersonalityEncoding() const { return PersonalityEncoding; }
146+
unsigned getLSDAEncoding() const { return LSDAEncoding; }
147+
unsigned getTTypeEncoding() const { return TTypeEncoding; }
148+
139149
const MCExpr *getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
140150
MCStreamer &Streamer) const;
141151

‎llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp

+156
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,156 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
9595
const TargetMachine &TgtM) {
9696
TargetLoweringObjectFile::Initialize(Ctx, TgtM);
9797
TM = &TgtM;
98+
99+
bool Large = TgtM.getCodeModel() == CodeModel::Large;
100+
101+
switch (TgtM.getTargetTriple().getArch()) {
102+
case Triple::arm:
103+
case Triple::armeb:
104+
case Triple::thumb:
105+
case Triple::thumbeb:
106+
if (Ctx.getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM)
107+
break;
108+
// Fallthrough if not using EHABI
109+
LLVM_FALLTHROUGH;
110+
case Triple::ppc:
111+
case Triple::x86:
112+
PersonalityEncoding = isPositionIndependent()
113+
? dwarf::DW_EH_PE_indirect |
114+
dwarf::DW_EH_PE_pcrel |
115+
dwarf::DW_EH_PE_sdata4
116+
: dwarf::DW_EH_PE_absptr;
117+
LSDAEncoding = isPositionIndependent()
118+
? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
119+
: dwarf::DW_EH_PE_absptr;
120+
TTypeEncoding = isPositionIndependent()
121+
? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
122+
dwarf::DW_EH_PE_sdata4
123+
: dwarf::DW_EH_PE_absptr;
124+
break;
125+
case Triple::x86_64:
126+
if (isPositionIndependent()) {
127+
PersonalityEncoding =
128+
dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
129+
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
130+
LSDAEncoding = dwarf::DW_EH_PE_pcrel |
131+
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
132+
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
133+
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
134+
} else {
135+
PersonalityEncoding =
136+
Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
137+
LSDAEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
138+
TTypeEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
139+
}
140+
break;
141+
case Triple::hexagon:
142+
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
143+
LSDAEncoding = dwarf::DW_EH_PE_absptr;
144+
TTypeEncoding = dwarf::DW_EH_PE_absptr;
145+
if (isPositionIndependent()) {
146+
PersonalityEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
147+
LSDAEncoding |= dwarf::DW_EH_PE_pcrel;
148+
TTypeEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
149+
}
150+
break;
151+
case Triple::aarch64:
152+
case Triple::aarch64_be:
153+
// The small model guarantees static code/data size < 4GB, but not where it
154+
// will be in memory. Most of these could end up >2GB away so even a signed
155+
// pc-relative 32-bit address is insufficient, theoretically.
156+
if (isPositionIndependent()) {
157+
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
158+
dwarf::DW_EH_PE_sdata8;
159+
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8;
160+
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
161+
dwarf::DW_EH_PE_sdata8;
162+
} else {
163+
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
164+
LSDAEncoding = dwarf::DW_EH_PE_absptr;
165+
TTypeEncoding = dwarf::DW_EH_PE_absptr;
166+
}
167+
break;
168+
case Triple::lanai:
169+
LSDAEncoding = dwarf::DW_EH_PE_absptr;
170+
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
171+
TTypeEncoding = dwarf::DW_EH_PE_absptr;
172+
break;
173+
case Triple::mips:
174+
case Triple::mipsel:
175+
case Triple::mips64:
176+
case Triple::mips64el:
177+
// MIPS uses indirect pointer to refer personality functions and types, so
178+
// that the eh_frame section can be read-only. DW.ref.personality will be
179+
// generated for relocation.
180+
PersonalityEncoding = dwarf::DW_EH_PE_indirect;
181+
// FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
182+
// identify N64 from just a triple.
183+
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
184+
dwarf::DW_EH_PE_sdata4;
185+
// We don't support PC-relative LSDA references in GAS so we use the default
186+
// DW_EH_PE_absptr for those.
187+
188+
// FreeBSD must be explicit about the data size and using pcrel since it's
189+
// assembler/linker won't do the automatic conversion that the Linux tools
190+
// do.
191+
if (TgtM.getTargetTriple().isOSFreeBSD()) {
192+
PersonalityEncoding |= dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
193+
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
194+
}
195+
break;
196+
case Triple::ppc64:
197+
case Triple::ppc64le:
198+
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
199+
dwarf::DW_EH_PE_udata8;
200+
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
201+
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
202+
dwarf::DW_EH_PE_udata8;
203+
break;
204+
case Triple::sparcel:
205+
case Triple::sparc:
206+
if (isPositionIndependent()) {
207+
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
208+
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
209+
dwarf::DW_EH_PE_sdata4;
210+
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
211+
dwarf::DW_EH_PE_sdata4;
212+
} else {
213+
LSDAEncoding = dwarf::DW_EH_PE_absptr;
214+
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
215+
TTypeEncoding = dwarf::DW_EH_PE_absptr;
216+
}
217+
break;
218+
case Triple::sparcv9:
219+
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
220+
if (isPositionIndependent()) {
221+
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
222+
dwarf::DW_EH_PE_sdata4;
223+
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
224+
dwarf::DW_EH_PE_sdata4;
225+
} else {
226+
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
227+
TTypeEncoding = dwarf::DW_EH_PE_absptr;
228+
}
229+
break;
230+
case Triple::systemz:
231+
// All currently-defined code models guarantee that 4-byte PC-relative
232+
// values will be in range.
233+
if (isPositionIndependent()) {
234+
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
235+
dwarf::DW_EH_PE_sdata4;
236+
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
237+
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
238+
dwarf::DW_EH_PE_sdata4;
239+
} else {
240+
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
241+
LSDAEncoding = dwarf::DW_EH_PE_absptr;
242+
TTypeEncoding = dwarf::DW_EH_PE_absptr;
243+
}
244+
break;
245+
default:
246+
break;
247+
}
98248
}
99249

100250
void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer &Streamer,
@@ -684,6 +834,12 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
684834
MachO::S_MOD_TERM_FUNC_POINTERS,
685835
SectionKind::getData());
686836
}
837+
838+
PersonalityEncoding =
839+
dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
840+
LSDAEncoding = dwarf::DW_EH_PE_pcrel;
841+
TTypeEncoding =
842+
dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
687843
}
688844

689845
void TargetLoweringObjectFileMachO::emitModuleMetadata(MCStreamer &Streamer,

‎llvm/lib/MC/MCObjectFileInfo.cpp

+5-157
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,7 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
6363
if (T.isWatchABI())
6464
OmitDwarfIfHaveCompactUnwind = true;
6565

66-
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel
67-
| dwarf::DW_EH_PE_sdata4;
68-
LSDAEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
69-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
70-
dwarf::DW_EH_PE_sdata4;
66+
FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
7167

7268
// .comm doesn't support alignment before Leopard.
7369
if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
@@ -311,158 +307,11 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
311307
case Triple::bpfeb:
312308
FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
313309
break;
314-
default:
315-
FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
316-
break;
317-
}
318-
319-
switch (T.getArch()) {
320-
case Triple::arm:
321-
case Triple::armeb:
322-
case Triple::thumb:
323-
case Triple::thumbeb:
324-
if (Ctx->getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM)
325-
break;
326-
// Fallthrough if not using EHABI
327-
LLVM_FALLTHROUGH;
328-
case Triple::ppc:
329-
case Triple::x86:
330-
PersonalityEncoding = PositionIndependent
331-
? dwarf::DW_EH_PE_indirect |
332-
dwarf::DW_EH_PE_pcrel |
333-
dwarf::DW_EH_PE_sdata4
334-
: dwarf::DW_EH_PE_absptr;
335-
LSDAEncoding = PositionIndependent
336-
? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
337-
: dwarf::DW_EH_PE_absptr;
338-
TTypeEncoding = PositionIndependent
339-
? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
340-
dwarf::DW_EH_PE_sdata4
341-
: dwarf::DW_EH_PE_absptr;
342-
break;
343-
case Triple::x86_64:
344-
if (PositionIndependent) {
345-
PersonalityEncoding =
346-
dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
347-
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
348-
LSDAEncoding = dwarf::DW_EH_PE_pcrel |
349-
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
350-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
351-
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
352-
} else {
353-
PersonalityEncoding =
354-
Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
355-
LSDAEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
356-
TTypeEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
357-
}
358-
break;
359310
case Triple::hexagon:
360-
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
361-
LSDAEncoding = dwarf::DW_EH_PE_absptr;
362-
FDECFIEncoding = dwarf::DW_EH_PE_absptr;
363-
TTypeEncoding = dwarf::DW_EH_PE_absptr;
364-
if (PositionIndependent) {
365-
PersonalityEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
366-
LSDAEncoding |= dwarf::DW_EH_PE_pcrel;
367-
FDECFIEncoding |= dwarf::DW_EH_PE_pcrel;
368-
TTypeEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
369-
}
370-
break;
371-
case Triple::aarch64:
372-
case Triple::aarch64_be:
373-
// The small model guarantees static code/data size < 4GB, but not where it
374-
// will be in memory. Most of these could end up >2GB away so even a signed
375-
// pc-relative 32-bit address is insufficient, theoretically.
376-
if (PositionIndependent) {
377-
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
378-
dwarf::DW_EH_PE_sdata8;
379-
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8;
380-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
381-
dwarf::DW_EH_PE_sdata8;
382-
} else {
383-
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
384-
LSDAEncoding = dwarf::DW_EH_PE_absptr;
385-
TTypeEncoding = dwarf::DW_EH_PE_absptr;
386-
}
387-
break;
388-
case Triple::lanai:
389-
LSDAEncoding = dwarf::DW_EH_PE_absptr;
390-
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
391-
TTypeEncoding = dwarf::DW_EH_PE_absptr;
392-
break;
393-
case Triple::mips:
394-
case Triple::mipsel:
395-
case Triple::mips64:
396-
case Triple::mips64el:
397-
// MIPS uses indirect pointer to refer personality functions and types, so
398-
// that the eh_frame section can be read-only. DW.ref.personality will be
399-
// generated for relocation.
400-
PersonalityEncoding = dwarf::DW_EH_PE_indirect;
401-
// FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
402-
// identify N64 from just a triple.
403-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
404-
dwarf::DW_EH_PE_sdata4;
405-
// We don't support PC-relative LSDA references in GAS so we use the default
406-
// DW_EH_PE_absptr for those.
407-
408-
// FreeBSD must be explicit about the data size and using pcrel since it's
409-
// assembler/linker won't do the automatic conversion that the Linux tools
410-
// do.
411-
if (T.isOSFreeBSD()) {
412-
PersonalityEncoding |= dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
413-
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
414-
}
415-
break;
416-
case Triple::ppc64:
417-
case Triple::ppc64le:
418-
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
419-
dwarf::DW_EH_PE_udata8;
420-
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
421-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
422-
dwarf::DW_EH_PE_udata8;
423-
break;
424-
case Triple::sparcel:
425-
case Triple::sparc:
426-
if (PositionIndependent) {
427-
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
428-
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
429-
dwarf::DW_EH_PE_sdata4;
430-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
431-
dwarf::DW_EH_PE_sdata4;
432-
} else {
433-
LSDAEncoding = dwarf::DW_EH_PE_absptr;
434-
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
435-
TTypeEncoding = dwarf::DW_EH_PE_absptr;
436-
}
437-
break;
438-
case Triple::sparcv9:
439-
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
440-
if (PositionIndependent) {
441-
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
442-
dwarf::DW_EH_PE_sdata4;
443-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
444-
dwarf::DW_EH_PE_sdata4;
445-
} else {
446-
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
447-
TTypeEncoding = dwarf::DW_EH_PE_absptr;
448-
}
449-
break;
450-
case Triple::systemz:
451-
// All currently-defined code models guarantee that 4-byte PC-relative
452-
// values will be in range.
453-
if (PositionIndependent) {
454-
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
455-
dwarf::DW_EH_PE_sdata4;
456-
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
457-
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
458-
dwarf::DW_EH_PE_sdata4;
459-
} else {
460-
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
461-
LSDAEncoding = dwarf::DW_EH_PE_absptr;
462-
TTypeEncoding = dwarf::DW_EH_PE_absptr;
463-
}
464-
break;
311+
FDECFIEncoding =
312+
PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
465313
default:
314+
FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
466315
break;
467316
}
468317

@@ -908,8 +757,7 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
908757
SupportsCompactUnwindWithoutEHFrame = false;
909758
OmitDwarfIfHaveCompactUnwind = false;
910759

911-
PersonalityEncoding = LSDAEncoding = FDECFIEncoding = TTypeEncoding =
912-
dwarf::DW_EH_PE_absptr;
760+
FDECFIEncoding = dwarf::DW_EH_PE_absptr;
913761

914762
CompactUnwindDwarfEHFrameOnly = 0;
915763

‎llvm/lib/Target/TargetLoweringObjectFile.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ void TargetLoweringObjectFile::Initialize(MCContext &ctx,
4545
Mang = new Mangler();
4646
InitMCObjectFileInfo(TM.getTargetTriple(), TM.isPositionIndependent(), *Ctx,
4747
TM.getCodeModel() == CodeModel::Large);
48+
49+
// Reset various EH DWARF encodings.
50+
PersonalityEncoding = LSDAEncoding = TTypeEncoding = dwarf::DW_EH_PE_absptr;
4851
}
4952

5053
TargetLoweringObjectFile::~TargetLoweringObjectFile() {

0 commit comments

Comments
 (0)
Please sign in to comment.