[Lldb-commits] [lldb] c2f819a - [MC] Refactor MCObjectFileInfo initialization and allow targets to create MCObjectFileInfo
Author: Philipp Krones Date: 2021-05-23T14:15:23-07:00 New Revision: c2f819af73c54a8cf923e5a25099ca95dbe76312 URL: https://github.com/llvm/llvm-project/commit/c2f819af73c54a8cf923e5a25099ca95dbe76312 DIFF: https://github.com/llvm/llvm-project/commit/c2f819af73c54a8cf923e5a25099ca95dbe76312.diff LOG: [MC] Refactor MCObjectFileInfo initialization and allow targets to create MCObjectFileInfo This makes it possible for targets to define their own MCObjectFileInfo. This MCObjectFileInfo is then used to determine things like section alignment. This is a follow up to D101462 and prepares for the RISCV backend defining the text section alignment depending on the enabled extensions. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D101921 Added: Modified: clang/lib/Parse/ParseStmtAsm.cpp clang/tools/driver/cc1as_main.cpp lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp lldb/source/Plugins/Instruction/MIPS/EmulateInstructionMIPS.cpp lldb/source/Plugins/Instruction/MIPS64/EmulateInstructionMIPS64.cpp llvm/include/llvm/MC/MCContext.h llvm/include/llvm/Support/TargetRegistry.h llvm/lib/CodeGen/MachineModuleInfo.cpp llvm/lib/DWARFLinker/DWARFStreamer.cpp llvm/lib/MC/MCContext.cpp llvm/lib/MC/MCDisassembler/Disassembler.cpp llvm/lib/Object/ModuleSymbolTable.cpp llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h llvm/tools/llvm-dwp/llvm-dwp.cpp llvm/tools/llvm-exegesis/lib/Analysis.cpp llvm/tools/llvm-exegesis/lib/Analysis.h llvm/tools/llvm-exegesis/lib/LlvmState.cpp llvm/tools/llvm-exegesis/lib/SnippetFile.cpp llvm/tools/llvm-jitlink/llvm-jitlink.cpp llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp llvm/tools/llvm-mc/llvm-mc.cpp llvm/tools/llvm-mca/llvm-mca.cpp llvm/tools/llvm-ml/Disassembler.cpp llvm/tools/llvm-ml/llvm-ml.cpp llvm/tools/llvm-objdump/MachODump.cpp llvm/tools/llvm-objdump/llvm-objdump.cpp llvm/tools/llvm-profgen/ProfiledBinary.cpp llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp llvm/tools/sancov/sancov.cpp llvm/unittests/CodeGen/MachineInstrTest.cpp llvm/unittests/CodeGen/MachineOperandTest.cpp llvm/unittests/CodeGen/TestAsmPrinter.cpp llvm/unittests/DebugInfo/DWARF/DwarfGenerator.cpp llvm/unittests/MC/DwarfLineTables.cpp llvm/unittests/MC/SystemZ/SystemZAsmLexerTest.cpp mlir/lib/Dialect/GPU/Transforms/SerializeToHsaco.cpp Removed: diff --git a/clang/lib/Parse/ParseStmtAsm.cpp b/clang/lib/Parse/ParseStmtAsm.cpp index 4c11fc60b4a0..9037895a3bbf 100644 --- a/clang/lib/Parse/ParseStmtAsm.cpp +++ b/clang/lib/Parse/ParseStmtAsm.cpp @@ -577,20 +577,22 @@ StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) { TheTarget->createMCAsmInfo(*MRI, TT, MCOptions)); // Get the instruction descriptor. std::unique_ptr MII(TheTarget->createMCInstrInfo()); - std::unique_ptr MOFI(new llvm::MCObjectFileInfo()); std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TT, TO.CPU, FeaturesStr)); // Target MCTargetDesc may not be linked in clang-based tools. - if (!MAI || !MII || !MOFI || !STI) { + + if (!MAI || !MII || !STI) { Diag(AsmLoc, diag::err_msasm_unable_to_create_target) << "target MC unavailable"; return EmptyStmt(); } llvm::SourceMgr TempSrcMgr; - llvm::MCContext Ctx(TheTriple, MAI.get(), MRI.get(), MOFI.get(), STI.get(), - &TempSrcMgr); - MOFI->initMCObjectFileInfo(Ctx, /*PIC=*/false); + llvm::MCContext Ctx(TheTriple, MAI.get(), MRI.get(), STI.get(), &TempSrcMgr); + std::unique_ptr MOFI( + TheTarget->createMCObjectFileInfo(Ctx, /*PIC=*/false)); + Ctx.setObjectFileInfo(MOFI.get()); + std::unique_ptr Buffer = llvm::MemoryBuffer::getMemBuffer(AsmString, ""); diff --git a/clang/tools/driver/cc1as_main.cpp b/clang/tools/driver/cc1as_main.cpp index ec50e28f2796..9f6a58b634b4 100644 --- a/clang/tools/driver/cc1as_main.cpp +++ b/clang/tools/driver/cc1as_main.cpp @@ -383,10 +383,6 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, if (!Opts.SplitDwarfOutput.empty()) DwoOS = getOutputStream(Opts.SplitDwarfOutput, Diags, IsBinary); - // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and - // MCObjectFileInfo needs a MCContext reference in order to initialize itself. - std::unique_ptr MOFI(new MCObjectFileInfo()); - // Build up the feature string from the target feature list. std::string FS = llvm::join(Opts.Features, ","); @@ -394,8 +390,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, TheTarget->createMCSubtargetInfo(Opts.Triple, Opts.CPU, FS)); assert(STI && "Unable to create subtarget info!"); - MCContext Ctx(Triple(Opts.Triple), MAI.get(), MRI.get(), MOFI.get(), -STI.get(), &SrcM
[Lldb-commits] [PATCH] D101236: [ASTImporter] Import definitions required for layout of [[no_unique_address]] from LLDB
jankratochvil updated this revision to Diff 347315. Herald added a project: LLDB. Herald added a subscriber: lldb-commits. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101236/new/ https://reviews.llvm.org/D101236 Files: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/test/Shell/Expr/no_unique_address.cpp lldb/test/Shell/SymbolFile/NativePDB/bitfields.cpp Index: lldb/test/Shell/SymbolFile/NativePDB/bitfields.cpp === --- lldb/test/Shell/SymbolFile/NativePDB/bitfields.cpp +++ lldb/test/Shell/SymbolFile/NativePDB/bitfields.cpp @@ -44,18 +44,18 @@ // CHECK: TranslationUnitDecl {{.*}} // CHECK: |-CXXRecordDecl {{.*}} struct Struct definition // CHECK: | |-FieldDecl {{.*}} A 'int' -// CHECK: | | `-IntegerLiteral {{.*}} 'int' 5 +// CHECK: | | {{.}}-IntegerLiteral {{.*}} 'int' 5 // CHECK: | |-FieldDecl {{.*}} B 'int' -// CHECK: | | `-IntegerLiteral {{.*}} 'int' 7 +// CHECK: | | {{.}}-IntegerLiteral {{.*}} 'int' 7 // CHECK: | |-FieldDecl {{.*}} C 'unsigned int' -// CHECK: | | `-IntegerLiteral {{.*}} 'int' 3 +// CHECK: | | {{.}}-IntegerLiteral {{.*}} 'int' 3 // CHECK: | |-FieldDecl {{.*}} D 'unsigned int' -// CHECK: | | `-IntegerLiteral {{.*}} 'int' 15 +// CHECK: | | {{.}}-IntegerLiteral {{.*}} 'int' 15 // CHECK: | |-FieldDecl {{.*}} E 'char' -// CHECK: | | `-IntegerLiteral {{.*}} 'int' 1 +// CHECK: | | {{.}}-IntegerLiteral {{.*}} 'int' 1 // CHECK: | |-FieldDecl {{.*}} F 'char' -// CHECK: | | `-IntegerLiteral {{.*}} 'int' 2 +// CHECK: | | {{.}}-IntegerLiteral {{.*}} 'int' 2 // CHECK: | |-FieldDecl {{.*}} G 'char' -// CHECK: | | `-IntegerLiteral {{.*}} 'int' 3 +// CHECK: | | {{.}}-IntegerLiteral {{.*}} 'int' 3 // CHECK: | `-FieldDecl {{.*}} H 'char' -// CHECK: | `-IntegerLiteral {{.*}} 'int' 3 +// CHECK: | {{.}}-IntegerLiteral {{.*}} 'int' 3 Index: lldb/test/Shell/Expr/no_unique_address.cpp === --- /dev/null +++ lldb/test/Shell/Expr/no_unique_address.cpp @@ -0,0 +1,15 @@ +// Test LLDB does not assert on miscalculated field offsets. + +// RUN: %clang_host %s -g -c -o %t.o +// RUN: %lldb %t.o -o "p c.c" -o exit | FileCheck %s + +// CHECK: (lldb) p c.c +// CHECK-NEXT: (char) $0 = '\0' + +struct A {}; +struct B { + [[no_unique_address]] A a; +}; +struct C : B { + char c; +} c; Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp === --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -7196,6 +7196,7 @@ if (bit_width) field->setBitWidth(bit_width); SetMemberOwningModule(field, record_decl); +field->addAttr(NoUniqueAddressAttr::CreateImplicit(ast->getASTContext())); if (name.empty()) { // Determine whether this field corresponds to an anonymous struct or Index: clang/unittests/AST/ASTImporterTest.cpp === --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -6357,6 +6357,92 @@ ToD->getTemplateSpecializationKind()); } +struct LLDBMinimalImport : ASTImporterOptionSpecificTestBase { + LLDBMinimalImport() { +Creator = [](ASTContext &ToContext, FileManager &ToFileManager, + ASTContext &FromContext, FileManager &FromFileManager, + bool MinimalImport, + const std::shared_ptr &SharedState) { + auto retval = new ASTImporter(ToContext, ToFileManager, FromContext, +FromFileManager, true /*MinimalImport*/, +// We use the regular lookup. +/*SharedState=*/nullptr); + retval->setODRHandling(clang::ASTImporter::ODRHandlingType::Liberal); + return retval; +}; + } +}; + +TEST_P(LLDBMinimalImport, LLDBImportNoUniqueAddress) { + TranslationUnitDecl *FromTU = getTuDecl( + R"( +// lldb/test/API/commands/expression/codegen-crash-typedefdecl-not-in_declcontext/main.cpp +template struct DWrapper {}; + +struct D {}; + +namespace NS { +typedef DWrapper DW; +} + +struct B { + NS::DW spd; + int a = 0; +}; + +struct E { + E(B &b) : b_ref(b) {} + NS::DW f() { return {}; }; + void g() { +return; //%self.expect("p b_ref", substrs=['(B) $0 =', '(spd = NS::DW', 'a = 0)']) + } + + B &b_ref; +}; +B b; +E e(b); + )", + Lang_CXX11); + + auto *FromB = FirstDeclMatcher().match( + FromTU, cxxRecordDecl(hasName("B"))); + +#if 0 + // Set up a stub external storage. + FromTU->setHasExternalLexicalStorage(true); + // Set up DeclContextBits.HasLazyExternalLexicalLookups to true. + FromTU->setMustBuildLookupTable(); + struct TestExternalASTSource : ExternalASTSource {}; + Fro