module Child {
header "Child.h"
}
+ module Empty {
+ header "Empty.h"
+ }
}
EOF
clang -D CHILD_H -E -o Child.h submodules.m
+ touch empty.h
clang -cc1 -emit-obj -fmodules -fmodule-map-file=modules.modulemap \
-fmodule-format=obj -g -dwarf-ext-refs -fmodules-cache-path=. \
-fdisable-module-hash submodules.m -o 1.o
// ---------------------------------------------------------------------
#ifdef CHILD_H
// ---------------------------------------------------------------------
+
// CHECK: DW_TAG_compile_unit
// CHECK-NOT: DW_TAG
// CHECK: DW_TAG_module
// CHECK: DW_TAG_structure_type
// CHECK-NOT: DW_TAG
// CHECK: DW_AT_name {{.*}}"PruneMeNot"
-
struct PruneMeNot;
// ---------------------------------------------------------------------
#else
// ---------------------------------------------------------------------
+// CHECK: DW_TAG_compile_unit
+// CHECK: DW_TAG_module
+// CHECK-NEXT: DW_AT_name{{.*}}"Parent"
+// CHECK: DW_TAG_module
+// CHECK-NEXT: DW_AT_name{{.*}}"Child"
+// CHECK: 0x0[[EMPTY:.*]]: DW_TAG_module
+// CHECK-NEXT: DW_AT_name{{.*}}"Empty"
+
+// CHECK: DW_AT_import {{.*}}0x{{0*}}[[EMPTY]]
@import Parent.Child;
+@import Parent.Empty;
int main(int argc, char **argv) { return 0; }
#endif
DIE->getAttributeValueAsUnsignedConstant(
&CU.getOrigUnit(), dwarf::DW_AT_declaration, 0);
+ // Don't prune it if there is no definition for the DIE.
+ Info.Prune &= Info.Ctxt && Info.Ctxt->getCanonicalDIEOffset();
+
return Info.Prune;
}
DWARFContextInMemory DwarfContext(*ErrOrObj);
startDebugObject(DwarfContext, *Obj);
- // In a first phase, just read in the debug info and store the DIE
- // parent links that we will use during the next phase.
+ // In a first phase, just read in the debug info and load all clang modules.
for (const auto &CU : DwarfContext.compile_units()) {
auto *CUDie = CU->getUnitDIE(false);
if (Options.Verbose) {
outs() << "Input compilation unit:";
CUDie->dump(outs(), CU.get(), 0);
}
- if (!registerModuleReference(*CUDie, *CU, ModuleMap)) {
+
+ if (!registerModuleReference(*CUDie, *CU, ModuleMap))
Units.emplace_back(*CU, UnitID++, !Options.NoODR, "");
- analyzeContextInfo(CUDie, 0, Units.back(), &ODRContexts.getRoot(),
- StringPool, ODRContexts);
- }
}
+ // Now build the DIE parent links that we will use during the next phase.
+ for (auto &CurrentUnit : Units)
+ analyzeContextInfo(CurrentUnit.getOrigUnit().getUnitDIE(), 0, CurrentUnit,
+ &ODRContexts.getRoot(), StringPool, ODRContexts);
+
// Then mark all the DIEs that need to be present in the linked
// output and collect some information about them. Note that this
// loop can not be merged with the previous one becaue cross-cu