-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[LLD][COFF] Add S_THUNK32 PDB records for all ARM64EC import thunks #115310
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
@llvm/pr-subscribers-platform-windows @llvm/pr-subscribers-lld Author: Jacek Caban (cjacek) ChangesFull diff: https://github.com/llvm/llvm-project/pull/115310.diff 2 Files Affected:
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index 9b035f53ef49cf..4af2270c0fc182 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -1365,6 +1365,10 @@ static codeview::CPUType toCodeViewMachine(COFF::MachineTypes machine) {
return codeview::CPUType::ARM7;
case COFF::IMAGE_FILE_MACHINE_ARM64:
return codeview::CPUType::ARM64;
+ case COFF::IMAGE_FILE_MACHINE_ARM64EC:
+ return codeview::CPUType::ARM64EC;
+ case COFF::IMAGE_FILE_MACHINE_ARM64X:
+ return codeview::CPUType::ARM64X;
case COFF::IMAGE_FILE_MACHINE_ARMNT:
return codeview::CPUType::ARMNT;
case COFF::IMAGE_FILE_MACHINE_I386:
@@ -1431,7 +1435,13 @@ void PDBLinker::addCommonLinkerModuleSymbols(
ObjNameSym ons(SymbolRecordKind::ObjNameSym);
EnvBlockSym ebs(SymbolRecordKind::EnvBlockSym);
Compile3Sym cs(SymbolRecordKind::Compile3Sym);
- fillLinkerVerRecord(cs, ctx.config.machine);
+
+ MachineTypes machine = ctx.config.machine;
+ // MSVC uses the ARM64X machine type for ARM64EC targets in the common linker
+ // module record.
+ if (isArm64EC(machine))
+ machine = ARM64X;
+ fillLinkerVerRecord(cs, machine);
ons.Name = "* Linker *";
ons.Signature = 0;
@@ -1527,7 +1537,7 @@ void PDBLinker::addImportFilesToPDB() {
if (!file->thunkSym)
continue;
- if (!file->thunkSym->isLive())
+ if (!file->thunkSym->isLive() && !file->impchkThunk)
continue;
std::string dll = StringRef(file->dllName).lower();
@@ -1552,53 +1562,61 @@ void PDBLinker::addImportFilesToPDB() {
mod->setObjFileName(libPath);
}
- DefinedImportThunk *thunk = cast<DefinedImportThunk>(file->thunkSym);
- Chunk *thunkChunk = thunk->getChunk();
- OutputSection *thunkOS = ctx.getOutputSection(thunkChunk);
-
ObjNameSym ons(SymbolRecordKind::ObjNameSym);
Compile3Sym cs(SymbolRecordKind::Compile3Sym);
- Thunk32Sym ts(SymbolRecordKind::Thunk32Sym);
- ScopeEndSym es(SymbolRecordKind::ScopeEndSym);
ons.Name = file->dllName;
ons.Signature = 0;
fillLinkerVerRecord(cs, ctx.config.machine);
- ts.Name = thunk->getName();
- ts.Parent = 0;
- ts.End = 0;
- ts.Next = 0;
- ts.Thunk = ThunkOrdinal::Standard;
- ts.Length = thunkChunk->getSize();
- ts.Segment = thunkOS->sectionIndex;
- ts.Offset = thunkChunk->getRVA() - thunkOS->getRVA();
-
llvm::BumpPtrAllocator &bAlloc = lld::bAlloc();
mod->addSymbol(codeview::SymbolSerializer::writeOneSymbol(
ons, bAlloc, CodeViewContainer::Pdb));
mod->addSymbol(codeview::SymbolSerializer::writeOneSymbol(
cs, bAlloc, CodeViewContainer::Pdb));
- CVSymbol newSym = codeview::SymbolSerializer::writeOneSymbol(
- ts, bAlloc, CodeViewContainer::Pdb);
+ auto addThunk = [&](Symbol *sym, Chunk *chunk) {
+ OutputSection *thunkOS = ctx.getOutputSection(chunk);
+
+ Thunk32Sym ts(SymbolRecordKind::Thunk32Sym);
+ ScopeEndSym es(SymbolRecordKind::ScopeEndSym);
+
+ ts.Name = sym->getName();
+ ts.Parent = 0;
+ ts.End = 0;
+ ts.Next = 0;
+ ts.Thunk = ThunkOrdinal::Standard;
+ ts.Length = chunk->getSize();
+ ts.Segment = thunkOS->sectionIndex;
+ ts.Offset = chunk->getRVA() - thunkOS->getRVA();
- // Write ptrEnd for the S_THUNK32.
- ScopeRecord *thunkSymScope =
- getSymbolScopeFields(const_cast<uint8_t *>(newSym.data().data()));
+ CVSymbol newSym = codeview::SymbolSerializer::writeOneSymbol(
+ ts, bAlloc, CodeViewContainer::Pdb);
- mod->addSymbol(newSym);
+ // Write ptrEnd for the S_THUNK32.
+ ScopeRecord *thunkSymScope =
+ getSymbolScopeFields(const_cast<uint8_t *>(newSym.data().data()));
- newSym = codeview::SymbolSerializer::writeOneSymbol(es, bAlloc,
- CodeViewContainer::Pdb);
- thunkSymScope->ptrEnd = mod->getNextSymbolOffset();
+ mod->addSymbol(newSym);
- mod->addSymbol(newSym);
+ newSym = codeview::SymbolSerializer::writeOneSymbol(es, bAlloc,
+ CodeViewContainer::Pdb);
+ thunkSymScope->ptrEnd = mod->getNextSymbolOffset();
+
+ mod->addSymbol(newSym);
+
+ pdb::SectionContrib sc =
+ createSectionContrib(ctx, chunk, mod->getModuleIndex());
+ mod->setFirstSectionContrib(sc);
+ };
- pdb::SectionContrib sc =
- createSectionContrib(ctx, thunk->getChunk(), mod->getModuleIndex());
- mod->setFirstSectionContrib(sc);
+ if (file->auxThunkSym && file->auxThunkSym->isLive())
+ addThunk(file->thunkSym, file->auxThunkSym->getChunk());
+ if (file->impchkThunk)
+ addThunk(file->impchkThunk->sym, file->impchkThunk);
+ if (file->thunkSym->isLive())
+ addThunk(file->thunkSym, file->thunkSym->getChunk());
}
}
diff --git a/lld/test/COFF/arm64ec-pdb.test b/lld/test/COFF/arm64ec-pdb.test
new file mode 100644
index 00000000000000..3c0fa28c1a2d52
--- /dev/null
+++ b/lld/test/COFF/arm64ec-pdb.test
@@ -0,0 +1,275 @@
+REQUIRES: aarch64, x86
+RUN: split-file %s %t.dir && cd %t.dir
+
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test-arm64ec.s -o test-arm64ec.obj
+RUN: llvm-mc -filetype=obj -triple=x86_64-windows test-x86_64.s -o test-x86_64.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
+RUN: llvm-lib -out:test.lib -def:test.def -machine:arm64ec
+
+RUN: lld-link -out:out.dll -debug -machine:arm64ec -dll -noentry test-arm64ec.obj test-x86_64.obj loadconfig-arm64ec.obj test.lib
+RUN: llvm-pdbutil dump out.pdb -all | FileCheck %s
+
+CHECK: Streams
+CHECK-NEXT: ============================================================
+CHECK: Stream 10 ( 184 bytes): [Module "Import:test.dll"]
+CHECK-NEXT: Blocks: [9]
+CHECK-NEXT: Stream 11 ( {{[0-9]+}} bytes): [Module "* Linker *"]
+CHECK-NEXT: Blocks: [10]
+
+CHECK: Module Stats
+CHECK-NEXT: ============================================================
+CHECK-NEXT: Mod 0000 | `{{.*}}test-arm64ec.obj`:
+CHECK-NEXT: Mod 0 (debug info not present): [{{.*}}test-arm64ec.obj]
+CHECK-NEXT: Mod 0001 | `{{.*}}test-x86_64.obj`:
+CHECK-NEXT: Mod 1 (debug info not present): [{{.*}}test-x86_64.obj]
+CHECK-NEXT: Mod 0002 | `{{.*}}loadconfig-arm64ec.obj`:
+CHECK-NEXT: Mod 2 (debug info not present): [{{.*}}loadconfig-arm64ec.obj]
+CHECK-NEXT: Mod 0003 | `test.dll`:
+CHECK-NEXT: Mod 3 (debug info not present): [test.dll]
+CHECK-NEXT: Mod 0004 | `Import:test.dll`:
+CHECK-NEXT: Stream 10, 184 bytes
+
+CHECK: Modules
+CHECK-NEXT: ============================================================
+CHECK-NEXT: Mod 0000 | `{{.*}}test-arm64ec.obj`:
+CHECK-NEXT: SC[.text] | mod = 0, 0001:0000, size = 8, data crc = 2063330902, reloc crc = 0
+CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
+CHECK-NEXT: IMAGE_SCN_MEM_READ
+CHECK-NEXT: Obj: `{{.*}}test-arm64ec.obj`:
+CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
+CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
+CHECK-NEXT: Mod 0001 | `{{.*}}test-x86_64.obj`:
+CHECK-NEXT: SC[.text] | mod = 1, 0001:4096, size = 0, data crc = 0, reloc crc = 0
+CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
+CHECK-NEXT: IMAGE_SCN_MEM_READ
+CHECK-NEXT: Obj: `{{.*}}test-x86_64.obj`:
+CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
+CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
+CHECK-NEXT: Mod 0002 | `{{.*}}loadconfig-arm64ec.obj`:
+CHECK-NEXT: SC[.text] | mod = 2, 0001:0008, size = 0, data crc = 0, reloc crc = 0
+CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_EXECUTE |
+CHECK-NEXT: IMAGE_SCN_MEM_READ
+CHECK-NEXT: Obj: `{{.*}}loadconfig-arm64ec.obj`:
+CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
+CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
+CHECK-NEXT: Mod 0003 | `test.dll`:
+CHECK-NEXT: SC[???] | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 0
+CHECK-NEXT: none
+CHECK-NEXT: Obj: `{{.*}}test.lib`:
+CHECK-NEXT: debug stream: 65535, # files: 0, has ec info: false
+CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
+CHECK-NEXT: Mod 0004 | `Import:test.dll`:
+CHECK-NEXT: SC[.text] | mod = 4, 0001:4096, size = 6, data crc = 0, reloc crc = 0
+CHECK-NEXT: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
+CHECK-NEXT: Obj: `{{.*}}test.lib`:
+CHECK-NEXT: debug stream: 10, # files: 0, has ec info: false
+CHECK-NEXT: pdb file ni: 0 ``, src file ni: 0 ``
+CHECK-NEXT: Mod 0005 | `* Linker *`:
+CHECK-NEXT: SC[???] | mod = 65535, 65535:0000, size = -1, data crc = 0, reloc crc = 0
+CHECK-NEXT: none
+CHECK-NEXT: Obj: ``:
+CHECK-NEXT: debug stream: 11, # files: 0, has ec info: false
+CHECK-NEXT: pdb file ni: 1 `{{.*}}out.pdb`, src file ni: 0 ``
+
+CHECK: Public Symbols
+CHECK-NEXT: ============================================================
+CHECK-NEXT: Records
+CHECK-NEXT: 544 | S_PUB32 [size = 28] `x86_64_sym`
+CHECK-NEXT: flags = none, addr = 0005:0008
+CHECK-NEXT: 496 | S_PUB32 [size = 28] `arm64ec_sym`
+CHECK-NEXT: flags = none, addr = 0005:0000
+CHECK-NEXT: 168 | S_PUB32 [size = 44] `__hybrid_auxiliary_iat_copy`
+CHECK-NEXT: flags = none, addr = 0002:
+CHECK-NEXT: 96 | S_PUB32 [size = 32] `__chpe_metadata`
+CHECK-NEXT: flags = none, addr = 0003:0000
+CHECK-NEXT: 416 | S_PUB32 [size = 48] `__x64_code_ranges_to_entry_points`
+CHECK-NEXT: flags = none, addr = 0002:
+CHECK-NEXT: 0 | S_PUB32 [size = 20] `#func`
+CHECK-NEXT: flags = function, addr = 0001:0008
+CHECK-NEXT: 244 | S_PUB32 [size = 40] `__icall_helper_arm64ec`
+CHECK-NEXT: flags = none, addr = 0001:0000
+CHECK-NEXT: 64 | S_PUB32 [size = 32] `__auximpcopy_func`
+CHECK-NEXT: flags = none, addr = 0002:
+CHECK-NEXT: 464 | S_PUB32 [size = 32] `_load_config_used`
+CHECK-NEXT: flags = none, addr = 0002:
+CHECK-NEXT: 524 | S_PUB32 [size = 20] `func`
+CHECK-NEXT: flags = function, addr = 0001:4096
+CHECK-NEXT: 128 | S_PUB32 [size = 40] `__hybrid_auxiliary_iat`
+CHECK-NEXT: flags = none, addr = 0002:8192
+CHECK-NEXT: 284 | S_PUB32 [size = 32] `__imp_aux_func`
+CHECK-NEXT: flags = none, addr = 0002:0000
+CHECK-NEXT: 344 | S_PUB32 [size = 28] `__impchk_func`
+CHECK-NEXT: flags = function, addr = 0001:0020
+CHECK-NEXT: 372 | S_PUB32 [size = 44] `__os_arm64x_dispatch_icall`
+CHECK-NEXT: flags = none, addr = 0002:
+CHECK-NEXT: 212 | S_PUB32 [size = 32] `__hybrid_code_map`
+CHECK-NEXT: flags = none, addr = 0002:
+CHECK-NEXT: 20 | S_PUB32 [size = 44] `__arm64x_redirection_metadata`
+CHECK-NEXT: flags = none, addr = 0004:0000
+CHECK-NEXT: 316 | S_PUB32 [size = 28] `__imp_func`
+CHECK-NEXT: flags = none, addr = 0002:8192
+
+CHECK: Symbols
+CHECK-NEXT: ============================================================
+CHECK-NEXT: Mod 0000 | `{{.*}}test-arm64ec.obj`:
+CHECK-NEXT: Error loading module stream 0. The specified stream could not be loaded. Module stream not present
+CHECK-NEXT: Mod 0001 | `{{.*}}test-x86_64.obj`:
+CHECK-NEXT: Error loading module stream 1. The specified stream could not be loaded. Module stream not present
+CHECK-NEXT: Mod 0002 | `{{.*}}loadconfig-arm64ec.obj`:
+CHECK-NEXT: Error loading module stream 2. The specified stream could not be loaded. Module stream not present
+CHECK-NEXT: Mod 0003 | `test.dll`:
+CHECK-NEXT: Error loading module stream 3. The specified stream could not be loaded. Module stream not present
+CHECK-NEXT: Mod 0004 | `Import:test.dll`:
+CHECK-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `test.dll`
+CHECK-NEXT: 24 | S_COMPILE3 [size = 40]
+CHECK-NEXT: machine = arm64ec, Ver = LLVM Linker, language = link
+CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0
+CHECK-NEXT: flags = none
+CHECK-NEXT: 64 | S_THUNK32 [size = 32] `func`
+CHECK-NEXT: parent = 0, end = 96, next = 0
+CHECK-NEXT: kind = thunk, size = 12, addr = 0001:0008
+CHECK-NEXT: 96 | S_END [size = 4]
+CHECK-NEXT: 100 | S_THUNK32 [size = 40] `__impchk_func`
+CHECK-NEXT: parent = 0, end = 140, next = 0
+CHECK-NEXT: kind = thunk, size = 20, addr = 0001:0020
+CHECK-NEXT: 140 | S_END [size = 4]
+CHECK-NEXT: 144 | S_THUNK32 [size = 32] `func`
+CHECK-NEXT: parent = 0, end = 176, next = 0
+CHECK-NEXT: kind = thunk, size = 6, addr = 0001:4096
+CHECK-NEXT: 176 | S_END [size = 4]
+CHECK-NEXT: Mod 0005 | `* Linker *`:
+CHECK-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `* Linker *`
+CHECK-NEXT: 24 | S_COMPILE3 [size = 40]
+CHECK-NEXT: machine = arm64x, Ver = LLVM Linker, language = link
+CHECK-NEXT: frontend = 0.0.0.0, backend = 14.10.25019.0
+CHECK-NEXT: flags = none
+CHECK-NEXT: 64 | S_ENVBLOCK [size = {{[0-9]+}}]
+CHECK: {{[0-9]+}} | S_SECTION [size = 28] `.text`
+CHECK-NEXT: length = 4102, alignment = 12, rva = 4096, section # = 1
+CHECK-NEXT: characteristics =
+CHECK-NEXT: code
+CHECK-NEXT: execute permissions
+CHECK-NEXT: read permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.text`
+CHECK-NEXT: length = 8, addr = 0001:0000
+CHECK-NEXT: characteristics =
+CHECK-NEXT: code
+CHECK-NEXT: execute permissions
+CHECK-NEXT: read permissions
+CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.rdata`
+CHECK-NEXT: length = 8208, alignment = 12, rva = 12288, section # = 2
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$5`
+CHECK-NEXT: length = 16, addr = 0002:0000
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.00cfg`
+CHECK-NEXT: length = 456, addr = 0002:
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$2`
+CHECK-NEXT: length = 40, addr = 0002:
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$4`
+CHECK-NEXT: length = 16, addr = 0002:
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$6`
+CHECK-NEXT: length = 8, addr = 0002:
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$7`
+CHECK-NEXT: length = 9, addr = 0002:
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$a`
+CHECK-NEXT: length = 16, addr = 0002:
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 28] `.idata$9`
+CHECK-NEXT: length = 16, addr = 0002:8192
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.data`
+CHECK-NEXT: length = 124, alignment = 12, rva = 24576, section # = 3
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.data`
+CHECK-NEXT: length = 124, addr = 0003:0000
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.bss`
+CHECK-NEXT: length = 0, addr = 0003:0124
+CHECK-NEXT: characteristics =
+CHECK-NEXT: uninitialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: write permissions
+CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.a64xrm`
+CHECK-NEXT: length = 8, alignment = 12, rva = 28672, section # = 4
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.test`
+CHECK-NEXT: length = 16, alignment = 12, rva = 32768, section # = 5
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: {{[0-9]+}} | S_COFFGROUP [size = 24] `.test`
+CHECK-NEXT: length = 16, addr = 0005:0000
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: read permissions
+CHECK-NEXT: {{[0-9]+}} | S_SECTION [size = 28] `.reloc`
+CHECK-NEXT: length = 32, alignment = 12, rva = 36864, section # = 6
+CHECK-NEXT: characteristics =
+CHECK-NEXT: initialized data
+CHECK-NEXT: discardable
+CHECK-NEXT: read permissions
+
+#--- test-arm64ec.s
+ .text
+ .globl __icall_helper_arm64ec
+ .p2align 2, 0x0
+__icall_helper_arm64ec:
+ mov w0, #0
+ ret
+
+ .section .test,"dr"
+ .globl arm64ec_sym
+arm64ec_sym:
+ .rva __imp_func
+ .rva __imp_aux_func
+
+#--- test-x86_64.s
+ .section .test,"dr"
+ .globl x86_64_sym
+x86_64_sym:
+ .rva __imp_func
+ .rva __imp_aux_func
+
+#--- test.def
+LIBRARY test.dll
+EXPORTS
+ func
|
Depends on #115309. MSVC appears to use the demangled name for the auxiliary thunk. I followed this approach, which is why I pass |
✅ With the latest revision this PR passed the C/C++ code formatter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this looks reasonable and correct, but I think it would be good to have a second look from people who know PDB better than me, so CC @rnk.
I don't mind approving this after a couple days, if there's no interest in commenting on it, from the other usual lld/COFF reviewers.
|
||
mod->addSymbol(newSym); | ||
newSym = codeview::SymbolSerializer::writeOneSymbol( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wow, this diff surely is actively hard to follow; switching the diff to ignore whitespace doesn't seem to help...
No description provided.