1515#include " objwriter.h"
1616#include " debugInfo/dwarf/dwarfTypeBuilder.h"
1717#include " debugInfo/codeView/codeViewTypeBuilder.h"
18+ #include " cvconst.h"
1819#include " llvm/DebugInfo/CodeView/CodeView.h"
1920#include " llvm/DebugInfo/CodeView/Line.h"
2021#include " llvm/DebugInfo/CodeView/SymbolRecord.h"
@@ -343,14 +344,18 @@ void ObjectWriter::EmitSymbolDef(const char *SymbolName, bool global) {
343344
344345 Triple TheTriple = TMachine->getTargetTriple ();
345346
346- // A Thumb2 function symbol should be marked with an appropriate ELF
347- // attribute to make later computation of a relocation address value correct
347+ // An ARM function symbol should be marked with an appropriate ELF attribute
348+ // to make later computation of a relocation address value correct
348349
349350 if (TheTriple.getObjectFormat () == Triple::ELF &&
350351 Streamer->getCurrentSectionOnly ()->getKind ().isText ()) {
351352 switch (TheTriple.getArch ()) {
353+ case Triple::arm:
354+ case Triple::armeb:
352355 case Triple::thumb:
356+ case Triple::thumbeb:
353357 case Triple::aarch64:
358+ case Triple::aarch64_be:
354359 Streamer->EmitSymbolAttribute (Sym, MCSA_ELF_TypeFunction);
355360 break ;
356361 default :
@@ -599,6 +604,51 @@ void ObjectWriter::EmitVarDefRange(const MCSymbol *Fn,
599604 Streamer->EmitIntValue (Range.Range , 2 );
600605}
601606
607+ // Maps an ICorDebugInfo register number to the corresponding CodeView
608+ // register number
609+ CVRegNum ObjectWriter::GetCVRegNum (ICorDebugInfo::RegNum RegNum) {
610+ switch (TMachine->getTargetTriple ().getArch ()) {
611+ case Triple::x86:
612+ if (X86::ICorDebugInfo::REGNUM_EAX <= RegNum &&
613+ RegNum <= X86::ICorDebugInfo::REGNUM_EDI) {
614+ return RegNum - X86::ICorDebugInfo::REGNUM_EAX + CV_REG_EAX;
615+ }
616+ break ;
617+ case Triple::x86_64:
618+ if (Amd64::ICorDebugInfo::REGNUM_RAX <= RegNum &&
619+ RegNum <= Amd64::ICorDebugInfo::REGNUM_R15) {
620+ return RegNum - Amd64::ICorDebugInfo::REGNUM_RAX + CV_AMD64_RAX;
621+ }
622+ break ;
623+ case Triple::arm:
624+ case Triple::armeb:
625+ case Triple::thumb:
626+ case Triple::thumbeb:
627+ if (Arm::ICorDebugInfo::REGNUM_R0 <= RegNum &&
628+ RegNum <= Arm::ICorDebugInfo::REGNUM_PC) {
629+ return RegNum - Arm::ICorDebugInfo::REGNUM_R0 + CV_ARM_R0;
630+ }
631+ break ;
632+ case Triple::aarch64:
633+ case Triple::aarch64_be:
634+ if (Arm64::ICorDebugInfo::REGNUM_X0 <= RegNum &&
635+ RegNum < Arm64::ICorDebugInfo::REGNUM_PC) {
636+ return RegNum - Arm64::ICorDebugInfo::REGNUM_X0 + CV_ARM64_X0;
637+ }
638+ // Special registers are ordered FP, LR, SP, PC in the ICorDebugInfo's
639+ // enumeration and FP, LR, SP, *ZR*, PC in the CodeView's enumeration.
640+ // For that reason handle the PC register separately.
641+ if (RegNum == Arm64::ICorDebugInfo::REGNUM_PC) {
642+ return CV_ARM64_PC;
643+ }
644+ break ;
645+ default :
646+ assert (false && " Unexpected architecture" );
647+ break ;
648+ }
649+ return CV_REG_NONE;
650+ }
651+
602652void ObjectWriter::EmitCVDebugVarInfo (const MCSymbol *Fn,
603653 const DebugVarInfo LocInfos[],
604654 int NumVarInfos) {
@@ -625,8 +675,8 @@ void ObjectWriter::EmitCVDebugVarInfo(const MCSymbol *Fn,
625675
626676 // Currently only support integer registers.
627677 // TODO: support xmm registers
628- if (Range.loc .vlReg .vlrReg >=
629- sizeof (cvRegMapAmd64) / sizeof (cvRegMapAmd64[ 0 ]) ) {
678+ CVRegNum CVReg = GetCVRegNum (Range.loc .vlReg .vlrReg );
679+ if (CVReg == CV_REG_NONE ) {
630680 break ;
631681 }
632682 SymbolRecordKind SymbolKind = SymbolRecordKind::DefRangeRegisterSym;
@@ -639,8 +689,9 @@ void ObjectWriter::EmitCVDebugVarInfo(const MCSymbol *Fn,
639689 DefRangeRegisterSymbol.Range .Range =
640690 Range.endOffset - Range.startOffset ;
641691 DefRangeRegisterSymbol.Range .ISectStart = 0 ;
642- DefRangeRegisterSymbol.Hdr .Register =
643- cvRegMapAmd64[Range.loc .vlReg .vlrReg ];
692+ DefRangeRegisterSymbol.Hdr .Register = CVReg;
693+ DefRangeRegisterSymbol.Hdr .MayHaveNoName = 0 ;
694+
644695 unsigned Length = sizeof (DefRangeRegisterSymbol.Hdr );
645696 Streamer->EmitBytes (
646697 StringRef ((char *)&DefRangeRegisterSymbol.Hdr , Length));
@@ -651,16 +702,11 @@ void ObjectWriter::EmitCVDebugVarInfo(const MCSymbol *Fn,
651702 case ICorDebugInfo::VLT_STK: {
652703
653704 // TODO: support REGNUM_AMBIENT_SP
654- if (Range.loc .vlStk .vlsBaseReg >=
655- sizeof (cvRegMapAmd64) / sizeof (cvRegMapAmd64[ 0 ]) ) {
705+ CVRegNum CVReg = GetCVRegNum (Range.loc .vlStk .vlsBaseReg );
706+ if (CVReg == CV_REG_NONE ) {
656707 break ;
657708 }
658709
659- assert (Range.loc .vlStk .vlsBaseReg <
660- sizeof (cvRegMapAmd64) / sizeof (cvRegMapAmd64[0 ]) &&
661- " Register number should be in the range of [REGNUM_RAX, "
662- " REGNUM_R15]." );
663-
664710 SymbolRecordKind SymbolKind = SymbolRecordKind::DefRangeRegisterRelSym;
665711 unsigned SizeofDefRangeRegisterRelSym =
666712 sizeof (DefRangeRegisterRelSym::Hdr) +
@@ -672,8 +718,8 @@ void ObjectWriter::EmitCVDebugVarInfo(const MCSymbol *Fn,
672718 DefRangeRegisterRelSymbol.Range .Range =
673719 Range.endOffset - Range.startOffset ;
674720 DefRangeRegisterRelSymbol.Range .ISectStart = 0 ;
675- DefRangeRegisterRelSymbol.Hdr .Register =
676- cvRegMapAmd64[Range. loc . vlStk . vlsBaseReg ] ;
721+ DefRangeRegisterRelSymbol.Hdr .Register = CVReg;
722+ DefRangeRegisterRelSymbol. Hdr . Flags = 0 ;
677723 DefRangeRegisterRelSymbol.Hdr .BasePointerOffset =
678724 Range.loc .vlStk .vlsOffset ;
679725
@@ -1015,7 +1061,7 @@ void ObjectWriter::EmitARMExIdxPerOffset()
10151061 break ;
10161062 case CFI_ADJUST_CFA_OFFSET:
10171063 assert (Reg == DWARF_REG_ILLEGAL &&
1018- " Unexpected Register Value for OpAdjustCfaOffset" );
1064+ " Unexpected Register Value for OpAdjustCfaOffset" );
10191065 ATS.emitPad (CFIsPerOffset[i].Offset );
10201066 break ;
10211067 case CFI_DEF_CFA_REGISTER:
0 commit comments