From e502f005383568e3e3d22e1e0a9005c29572e720 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Tue, 8 Aug 2017 18:26:12 +0000 Subject: [PATCH] dsymutil: support dwarf version mismatches between object and clang module This adds a missing call to maybeUpdateMaxDwarfVersion when visitng a clang module. Failing to do so will cause a failure when emitting DWARF 4 forms into a CU that AsmPrinter believes to be DWARF 2. rdar://problem/33666528 llvm-svn: 310392 --- .../dsymutil/Inputs/modules-dwarf-version/1.o | Bin 0 -> 2404 bytes .../tools/dsymutil/X86/modules-dwarf-version.m | 23 +++++++++++++++++++++ llvm/tools/dsymutil/DwarfLinker.cpp | 4 +++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/dsymutil/Inputs/modules-dwarf-version/1.o create mode 100644 llvm/test/tools/dsymutil/X86/modules-dwarf-version.m diff --git a/llvm/test/tools/dsymutil/Inputs/modules-dwarf-version/1.o b/llvm/test/tools/dsymutil/Inputs/modules-dwarf-version/1.o new file mode 100644 index 0000000000000000000000000000000000000000..43bc63f6c5c54e23f75289fe41989ac61e8ca94a GIT binary patch literal 2404 zcma)8&2Jl35TCc3T|2R}aT*S-NXiPeYAaF46{t{ZzzzvYp%wi|Kcu$WtT&s)!Mipa zJ57v&ILZT8C61|iI5{L`^4=Qos$O(xad#Kb)r5-CNgqhuWj@L;Pk2G&ScHZyJ zdvD&@fBgOQzXX6#0SDwBWK*L78EGH#PvqQz9@0dl0?k2^Hev#?K~5ygs=LeeNRRBP zi7Qi^w$w&gA-veKJ+LNYNLp64wBT4}&z^J3{%qB<#*0(M%?OE;WY=}hZ!-ciZ93x3 zxTVINwO9{AH{x9`p8uc~a*(wqOLr@t(h5dJ;@PEA;4YCJ$NPbUzhn8ROFY^uP3gpY zi!Kl8uSmeM9x21Ut#jNqzrgnA+{LYUnOHQyS-Q+P#UkW>J=+OW?95N%ahhG=*|l25 zwS3#7^tSAGkXO%hPUm*bFT$g$p(&mDongEKjQ4eycwv4u+v&vnv;*&cmw5G?wQcu% zhw)}Pzdv`ybE+QZRks@cjj}&uS*OQ&Y9#pGn(Qp#Lm^il>xJ)#SBwHI%bmAo1H27s z$KS6h`vBujGaj3e0+^RNNm(zIvL7OLp5HX%-Q-F4_#uz)kRRP!_@L8$;S5TCFY;-Q zzlM?^Fb_D3+)lJ#S(okpZuEyLk*ctN4-E6*p_8_#a7JYQdVa%|oBJVF{dh{8B<5#gJ^x@jwiUgT|1i8X5g%0Q0&3I zD*J_MtTm0#o7kY$AyAEc8XH9t-cFrN?HvNpvN&;%DDJ76Uyy*>ZW3U*hZ4q zP}h2T@1f}Z5r^ag4!VFtC^*@$x-vi+P&B0^?moSA^_PG5eMNl=CNC5xWkHd|LklVL zMO}Ge_50>)=neBk`C$|in@g_Fxf@9B_`AhW&crWKAQHVP0Xj+ze_ZJ)kPVPq`!eO2 zcbWy%FCf#-$WJH64UtZQTy!k5N21yyK70y^kz87Qb{@oXMr6{7!0&j0tr}8?g*MQad{yh$^O~W* vqp5mcQ4op#+bDolx(zl#&{5z*`bR9O49I?kC5q5K$&wNqph1!qzEJodWm^b6 literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/X86/modules-dwarf-version.m b/llvm/test/tools/dsymutil/X86/modules-dwarf-version.m new file mode 100644 index 0000000..54e6192 --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/modules-dwarf-version.m @@ -0,0 +1,23 @@ +/* Compile with (using the module from the modules.m teastcase): + clang -c -fmodules -fmodule-map-file=modules.modulemap \ + -gdwarf-2 -gmodules -fmodules-cache-path=. \ + -Xclang -fdisable-module-hash modules.m -o 1.o +*/ + +// RUN: rm -rf %t.dir +// RUN: mkdir %t.dir +// RUN: cp %p/../Inputs/modules/Bar.pcm %t.dir +// RUN: cp %p/../Inputs/modules-dwarf-version/1.o %t.dir +// RUN: llvm-dsymutil -f -oso-prepend-path=%t.dir \ +// RUN: -y %p/dummy-debug-map.map -o - \ +// RUN: | llvm-dwarfdump --debug-dump=info - | FileCheck %s + +@import Bar; +int main(int argc, char **argv) { + struct Bar bar; + bar.value = argc; + return bar.value; +} + +// CHECK: Compile Unit: {{.*}}version = 0x0004 +// CHECK: Compile Unit: {{.*}}version = 0x0002 diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp index fcbc268..f9328e4 100644 --- a/llvm/tools/dsymutil/DwarfLinker.cpp +++ b/llvm/tools/dsymutil/DwarfLinker.cpp @@ -3325,8 +3325,10 @@ void DwarfLinker::loadClangModule(StringRef Filename, StringRef ModulePath, auto DwarfContext = DWARFContext::create(*ErrOrObj); RelocationManager RelocMgr(*this); for (const auto &CU : DwarfContext->compile_units()) { - auto CUDie = CU->getUnitDIE(false); + maybeUpdateMaxDwarfVersion(CU->getVersion()); + // Recursively get all modules imported by this one. + auto CUDie = CU->getUnitDIE(false); if (!registerModuleReference(CUDie, *CU, ModuleMap, Indent)) { if (Unit) { errs() << Filename << ": Clang modules are expected to have exactly" -- 2.7.4