mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Revert "Revert "Make the DWARF version emitted by the Swift compiler configurable.""
This commit is contained in:
@@ -13,7 +13,8 @@
|
||||
|
||||
namespace swift {
|
||||
|
||||
/// Represents the nine reflection sections used by Swift
|
||||
/// Represents the nine reflection sections used by Swift + the Swift AST
|
||||
/// section used by the debugger.
|
||||
enum ReflectionSectionKind : uint8_t {
|
||||
#define HANDLE_SWIFT_SECTION(KIND, MACHO, ELF, COFF) KIND,
|
||||
#include "llvm/BinaryFormat/Swift.def"
|
||||
|
||||
@@ -237,7 +237,7 @@ public:
|
||||
std::string DebugCompilationDir;
|
||||
|
||||
/// The DWARF version of debug info.
|
||||
unsigned DWARFVersion;
|
||||
uint8_t DWARFVersion = 4;
|
||||
|
||||
/// The command line string that is to be stored in the debug info.
|
||||
std::string DebugFlags;
|
||||
@@ -512,8 +512,7 @@ public:
|
||||
bool EmitCASIDFile;
|
||||
|
||||
IRGenOptions()
|
||||
: DWARFVersion(2),
|
||||
OutputKind(IRGenOutputKind::LLVMAssemblyAfterOptimization),
|
||||
: OutputKind(IRGenOutputKind::LLVMAssemblyAfterOptimization),
|
||||
Verify(true), OptMode(OptimizationMode::NotSet),
|
||||
Sanitizers(OptionSet<SanitizerKind>()),
|
||||
SanitizersWithRecoveryInstrumentation(OptionSet<SanitizerKind>()),
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
//===--- Dwarf.h - DWARF constants ------------------------------*- C++ -*-===//
|
||||
//
|
||||
// This source file is part of the Swift.org open source project
|
||||
//
|
||||
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
||||
// Licensed under Apache License v2.0 with Runtime Library Exception
|
||||
//
|
||||
// See https://swift.org/LICENSE.txt for license information
|
||||
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines several temporary Swift-specific DWARF constants.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef SWIFT_BASIC_DWARF_H
|
||||
#define SWIFT_BASIC_DWARF_H
|
||||
|
||||
#include "llvm/BinaryFormat/Dwarf.h"
|
||||
|
||||
namespace swift {
|
||||
/// The DWARF version emitted by the Swift compiler.
|
||||
const unsigned DWARFVersion = 4;
|
||||
|
||||
static const char MachOASTSegmentName[] = "__DWARF";
|
||||
static const char MachOASTSectionName[] = "__swift_ast";
|
||||
static const char ELFASTSectionName[] = ".swift_ast";
|
||||
static const char COFFASTSectionName[] = "swiftast";
|
||||
static const char WasmASTSectionName[] = ".swift_ast";
|
||||
} // end namespace swift
|
||||
|
||||
#endif // SWIFT_BASIC_DWARF_H
|
||||
@@ -125,6 +125,9 @@ public:
|
||||
/// What kind of debug info to generate.
|
||||
IRGenDebugInfoFormat DebugInfoFormat = IRGenDebugInfoFormat::None;
|
||||
|
||||
/// DWARF output format version number.
|
||||
std::optional<uint8_t> DWARFVersion;
|
||||
|
||||
/// Whether or not the driver should generate a module.
|
||||
bool ShouldGenerateModule = false;
|
||||
|
||||
|
||||
@@ -991,8 +991,8 @@ def gdwarf_types : Flag<["-"], "gdwarf-types">,
|
||||
Group<g_Group>, Flags<[FrontendOption]>,
|
||||
HelpText<"Emit full DWARF type info.">;
|
||||
def debug_prefix_map : Separate<["-"], "debug-prefix-map">,
|
||||
Flags<[FrontendOption]>,
|
||||
HelpText<"Remap source paths in debug info">, MetaVarName<"<prefix=replacement>">;
|
||||
Flags<[FrontendOption]>,
|
||||
HelpText<"Remap source paths in debug info">, MetaVarName<"<prefix=replacement>">;
|
||||
def coverage_prefix_map : Separate<["-"], "coverage-prefix-map">,
|
||||
Flags<[FrontendOption]>,
|
||||
HelpText<"Remap source paths in coverage info">, MetaVarName<"<prefix=replacement>">;
|
||||
@@ -1007,6 +1007,10 @@ def file_compilation_dir : Separate<["-"], "file-compilation-dir">,
|
||||
def debug_info_format : Joined<["-"], "debug-info-format=">,
|
||||
Flags<[FrontendOption]>,
|
||||
HelpText<"Specify the debug info format type to either 'dwarf' or 'codeview'">;
|
||||
def dwarf_version : Joined<["-"], "dwarf-version=">,
|
||||
Flags<[FrontendOption]>,
|
||||
HelpText<"DWARF debug info version to produce if requested">,
|
||||
MetaVarName<"<version>">;
|
||||
|
||||
def prefix_serialized_debugging_options : Flag<["-"], "prefix-serialized-debugging-options">,
|
||||
Flags<[FrontendOption]>,
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "swift/ASTSectionImporter/ASTSectionImporter.h"
|
||||
#include "../Serialization/ModuleFormat.h"
|
||||
#include "swift/AST/ASTContext.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Serialization/SerializedModuleLoader.h"
|
||||
#include "swift/Serialization/Validation.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
|
||||
#include "swift/AST/DiagnosticsDriver.h"
|
||||
#include "swift/AST/PlatformKind.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/LLVM.h"
|
||||
#include "swift/Basic/Platform.h"
|
||||
#include "swift/Basic/Range.h"
|
||||
@@ -626,6 +625,28 @@ toolchains::Darwin::addDeploymentTargetArgs(ArgStringList &Arguments,
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned getDWARFVersionForTriple(const llvm::Triple &triple) {
|
||||
llvm::VersionTuple osVersion;
|
||||
const DarwinPlatformKind kind = getDarwinPlatformKind(triple);
|
||||
switch (kind) {
|
||||
case DarwinPlatformKind::MacOS:
|
||||
triple.getMacOSXVersion(osVersion);
|
||||
if (osVersion < llvm::VersionTuple(10, 11))
|
||||
return 2;
|
||||
return 4;
|
||||
case DarwinPlatformKind::IPhoneOSSimulator:
|
||||
case DarwinPlatformKind::IPhoneOS:
|
||||
case DarwinPlatformKind::TvOS:
|
||||
case DarwinPlatformKind::TvOSSimulator:
|
||||
osVersion = triple.getiOSVersion();
|
||||
if (osVersion < llvm::VersionTuple(9))
|
||||
return 2;
|
||||
return 4;
|
||||
default:
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
|
||||
void toolchains::Darwin::addCommonFrontendArgs(
|
||||
const OutputInfo &OI, const CommandOutput &output,
|
||||
const llvm::opt::ArgList &inputArgs,
|
||||
@@ -644,6 +665,16 @@ void toolchains::Darwin::addCommonFrontendArgs(
|
||||
inputArgs.MakeArgString(variantSDKVersion->getAsString()));
|
||||
}
|
||||
}
|
||||
std::string dwarfVersion;
|
||||
{
|
||||
llvm::raw_string_ostream os(dwarfVersion);
|
||||
os << "-dwarf-version=";
|
||||
if (OI.DWARFVersion)
|
||||
os << *OI.DWARFVersion;
|
||||
else
|
||||
os << getDWARFVersionForTriple(getTriple());
|
||||
}
|
||||
arguments.push_back(inputArgs.MakeArgString(dwarfVersion));
|
||||
}
|
||||
|
||||
/// Add the frontend arguments needed to find external plugins in standard
|
||||
|
||||
@@ -1685,6 +1685,16 @@ void Driver::buildOutputInfo(const ToolChain &TC, const DerivedArgList &Args,
|
||||
: "-gdwarf_types");
|
||||
}
|
||||
|
||||
if (const Arg *A = Args.getLastArg(options::OPT_dwarf_version)) {
|
||||
unsigned vers;
|
||||
if (!StringRef(A->getValue()).getAsInteger(10, vers) && vers >= 2 &&
|
||||
vers <= 5)
|
||||
OI.DWARFVersion = vers;
|
||||
else
|
||||
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_value,
|
||||
A->getAsString(Args), A->getValue());
|
||||
}
|
||||
|
||||
if (Args.hasArg(options::OPT_emit_module, options::OPT_emit_module_path)) {
|
||||
// The user has requested a module, so generate one and treat it as
|
||||
// top-level output.
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include "ToolChains.h"
|
||||
|
||||
#include "swift/AST/DiagnosticsDriver.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/LLVM.h"
|
||||
#include "swift/Basic/Platform.h"
|
||||
#include "swift/Basic/Range.h"
|
||||
@@ -262,6 +261,7 @@ void ToolChain::addCommonFrontendArgs(const OutputInfo &OI,
|
||||
inputArgs.AddLastArg(arguments, options::OPT_enable_private_imports);
|
||||
inputArgs.AddLastArg(arguments, options::OPT_g_Group);
|
||||
inputArgs.AddLastArg(arguments, options::OPT_debug_info_format);
|
||||
inputArgs.AddLastArg(arguments, options::OPT_dwarf_version);
|
||||
inputArgs.AddLastArg(arguments, options::OPT_import_underlying_module);
|
||||
inputArgs.AddLastArg(arguments, options::OPT_module_cache_path);
|
||||
inputArgs.AddLastArg(arguments, options::OPT_module_link_name);
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
|
||||
#include "ToolChains.h"
|
||||
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/LLVM.h"
|
||||
#include "swift/Basic/Platform.h"
|
||||
#include "swift/Basic/Range.h"
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
|
||||
#include "ToolChains.h"
|
||||
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/LLVM.h"
|
||||
#include "swift/Basic/Platform.h"
|
||||
#include "swift/Basic/Range.h"
|
||||
|
||||
@@ -2472,7 +2472,6 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
|
||||
Opts.DebugCompilationDir = std::string(cwd.str());
|
||||
}
|
||||
}
|
||||
|
||||
if (const Arg *A = Args.getLastArg(options::OPT_debug_info_format)) {
|
||||
if (A->containsValue("dwarf"))
|
||||
Opts.DebugInfoFormat = IRGenDebugInfoFormat::DWARF;
|
||||
@@ -2502,6 +2501,16 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
|
||||
: "-gdwarf_types");
|
||||
}
|
||||
|
||||
if (auto A = Args.getLastArg(OPT_dwarf_version)) {
|
||||
unsigned vers;
|
||||
if (!StringRef(A->getValue()).getAsInteger(10, vers) && vers >= 2 &&
|
||||
vers <= 5)
|
||||
Opts.DWARFVersion = vers;
|
||||
else
|
||||
Diags.diagnose(SourceLoc(), diag::error_invalid_arg_value,
|
||||
A->getAsString(Args), A->getValue());
|
||||
}
|
||||
|
||||
for (auto A : Args.getAllArgValues(options::OPT_file_prefix_map)) {
|
||||
auto SplitMap = StringRef(A).split('=');
|
||||
Opts.FilePrefixMap.addMapping(SplitMap.first, SplitMap.second);
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#include "swift/AST/TBDGenRequests.h"
|
||||
#include "swift/AST/TypeRefinementContext.h"
|
||||
#include "swift/Basic/Defer.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/Edit.h"
|
||||
#include "swift/Basic/FileSystem.h"
|
||||
#include "swift/Basic/LLVMInitialize.h"
|
||||
@@ -2241,9 +2240,9 @@ int swift::performFrontend(ArrayRef<const char *> Args,
|
||||
trace.emplace(*buffer);
|
||||
});
|
||||
|
||||
// Setting DWARF Version depend on platform
|
||||
// Setting DWARF Version based on frontend options.
|
||||
IRGenOptions &IRGenOpts = Invocation.getIRGenOptions();
|
||||
IRGenOpts.DWARFVersion = swift::DWARFVersion;
|
||||
IRGenOpts.DWARFVersion = IRGenOpts.DWARFVersion;
|
||||
|
||||
// The compiler invocation is now fully configured; notify our observer.
|
||||
if (observer) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "../Serialization/ModuleFormat.h"
|
||||
#include "IRGenModule.h"
|
||||
#include "swift/ABI/MetadataValues.h"
|
||||
#include "swift/ABI/ObjectFile.h"
|
||||
#include "swift/AST/DiagnosticsIRGen.h"
|
||||
#include "swift/AST/IRGenOptions.h"
|
||||
#include "swift/AST/IRGenRequests.h"
|
||||
@@ -26,7 +27,6 @@
|
||||
#include "swift/AST/SILOptimizerRequests.h"
|
||||
#include "swift/AST/TBDGenRequests.h"
|
||||
#include "swift/Basic/Defer.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/MD5Stream.h"
|
||||
#include "swift/Basic/Platform.h"
|
||||
#include "swift/Basic/STLExtras.h"
|
||||
@@ -1630,6 +1630,7 @@ void swift::createSwiftModuleObjectFile(SILModule &SILMod, StringRef Buffer,
|
||||
auto *ASTSym = new llvm::GlobalVariable(M, Ty, /*constant*/ true,
|
||||
llvm::GlobalVariable::InternalLinkage,
|
||||
Data, "__Swift_AST");
|
||||
|
||||
std::string Section;
|
||||
switch (IGM.TargetInfo.OutputObjectFormat) {
|
||||
case llvm::Triple::DXContainer:
|
||||
@@ -1638,19 +1639,24 @@ void swift::createSwiftModuleObjectFile(SILModule &SILMod, StringRef Buffer,
|
||||
case llvm::Triple::UnknownObjectFormat:
|
||||
llvm_unreachable("unknown object format");
|
||||
case llvm::Triple::XCOFF:
|
||||
case llvm::Triple::COFF:
|
||||
Section = COFFASTSectionName;
|
||||
case llvm::Triple::COFF: {
|
||||
SwiftObjectFileFormatCOFF COFF;
|
||||
Section = COFF.getSectionName(ReflectionSectionKind::swiftast);
|
||||
break;
|
||||
}
|
||||
case llvm::Triple::ELF:
|
||||
Section = ELFASTSectionName;
|
||||
case llvm::Triple::Wasm: {
|
||||
SwiftObjectFileFormatELF ELF;
|
||||
Section = ELF.getSectionName(ReflectionSectionKind::swiftast);
|
||||
break;
|
||||
case llvm::Triple::MachO:
|
||||
Section = std::string(MachOASTSegmentName) + "," + MachOASTSectionName;
|
||||
break;
|
||||
case llvm::Triple::Wasm:
|
||||
Section = WasmASTSectionName;
|
||||
}
|
||||
case llvm::Triple::MachO: {
|
||||
SwiftObjectFileFormatMachO MachO;
|
||||
Section = std::string(*MachO.getSegmentName()) + "," +
|
||||
MachO.getSectionName(ReflectionSectionKind::swiftast).str();
|
||||
break;
|
||||
}
|
||||
}
|
||||
ASTSym->setSection(Section);
|
||||
ASTSym->setAlignment(llvm::MaybeAlign(serialization::SWIFTMODULE_ALIGNMENT));
|
||||
::performLLVM(Opts, Ctx.Diags, nullptr, nullptr, IGM.getModule(),
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "swift/AST/Pattern.h"
|
||||
#include "swift/AST/TypeDifferenceVisitor.h"
|
||||
#include "swift/Basic/Compiler.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/SourceManager.h"
|
||||
#include "swift/Basic/Version.h"
|
||||
#include "swift/ClangImporter/ClangImporter.h"
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include "swift/AST/IRGenOptions.h"
|
||||
#include "swift/AST/IRGenRequests.h"
|
||||
#include "swift/AST/Module.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/LLVMExtras.h"
|
||||
#include "swift/ClangImporter/ClangImporter.h"
|
||||
#include "swift/Demangling/ManglingMacros.h"
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include "swift/AST/TypeCheckRequests.h"
|
||||
#include "swift/AST/TypeVisitor.h"
|
||||
#include "swift/Basic/Defer.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "swift/Basic/FileSystem.h"
|
||||
#include "swift/Basic/LLVMExtras.h"
|
||||
#include "swift/Basic/PathRemapper.h"
|
||||
|
||||
@@ -116,6 +116,14 @@
|
||||
// RUN: not %swiftc_driver -debug-info-format=codeview %s 2>&1 | %FileCheck -check-prefix MISSING_OPTION_G_ERROR %s
|
||||
// MISSING_OPTION_G_ERROR: error: option '-debug-info-format={{.*}}' is missing a required argument (-g)
|
||||
|
||||
// RUN: %swift_driver -### -g -dwarf-version=3 %s 2>&1 | %FileCheck -check-prefix DWARF_VERSION_3 %s
|
||||
// DWARF_VERSION_3: -dwarf-version=3
|
||||
// RUN: not %swift_driver -dwarf-version=1 %s 2>&1 | %FileCheck -check-prefix INVALID_DWARF_VERSION %s
|
||||
// RUN: not %swift_driver -dwarf-version=6 %s 2>&1 | %FileCheck -check-prefix INVALID_DWARF_VERSION %s
|
||||
// RUN: not %swiftc_driver -dwarf-version=1 %s 2>&1 | %FileCheck -check-prefix INVALID_DWARF_VERSION %s
|
||||
// RUN: not %swiftc_driver -dwarf-version=6 %s 2>&1 | %FileCheck -check-prefix INVALID_DWARF_VERSION %s
|
||||
// INVALID_DWARF_VERSION: invalid value '{{1|6}}' in '-dwarf-version={{1|6}}'
|
||||
|
||||
// RUN: not %swift_driver -gline-tables-only -debug-info-format=codeview %s 2>&1 | %FileCheck -check-prefix BAD_DEBUG_LEVEL_ERROR %s
|
||||
// RUN: not %swift_driver -gdwarf-types -debug-info-format=codeview %s 2>&1 | %FileCheck -check-prefix BAD_DEBUG_LEVEL_ERROR %s
|
||||
// RUN: not %swiftc_driver -gline-tables-only -debug-info-format=codeview %s 2>&1 | %FileCheck -check-prefix BAD_DEBUG_LEVEL_ERROR %s
|
||||
|
||||
@@ -16,27 +16,27 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "swift/ABI/ObjectFile.h"
|
||||
#include "swift/AST/ASTDemangler.h"
|
||||
#include "swift/AST/PrintOptions.h"
|
||||
#include "swift/ASTSectionImporter/ASTSectionImporter.h"
|
||||
#include "swift/Basic/LLVMInitialize.h"
|
||||
#include "swift/Frontend/Frontend.h"
|
||||
#include "swift/Serialization/SerializedModuleLoader.h"
|
||||
#include "swift/Serialization/Validation.h"
|
||||
#include "swift/Basic/Dwarf.h"
|
||||
#include "llvm/Object/ELFObjectFile.h"
|
||||
#include "swift/Basic/LLVMInitialize.h"
|
||||
#include "llvm/Object/COFF.h"
|
||||
#include "llvm/Object/ELFObjectFile.h"
|
||||
#include "llvm/Object/MachO.h"
|
||||
#include "llvm/Object/ObjectFile.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/PrettyStackTrace.h"
|
||||
#include "llvm/Support/Signals.h"
|
||||
#include "llvm/Support/TargetSelect.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
@@ -209,15 +209,19 @@ collectASTModules(llvm::cl::list<std::string> &InputNames,
|
||||
continue;
|
||||
}
|
||||
llvm::StringRef Name = *NameOrErr;
|
||||
if ((MachO && Name == swift::MachOASTSectionName) ||
|
||||
(ELF && Name == swift::ELFASTSectionName) ||
|
||||
(COFF && Name == swift::COFFASTSectionName)) {
|
||||
if ((MachO && Name == swift::SwiftObjectFileFormatMachO().getSectionName(
|
||||
swift::ReflectionSectionKind::swiftast)) ||
|
||||
(ELF && Name == swift::SwiftObjectFileFormatELF().getSectionName(
|
||||
swift::ReflectionSectionKind::swiftast)) ||
|
||||
(COFF && Name == swift::SwiftObjectFileFormatCOFF().getSectionName(
|
||||
swift::ReflectionSectionKind::swiftast))) {
|
||||
uint64_t Size = Section.getSize();
|
||||
|
||||
llvm::Expected<llvm::StringRef> ContentsReference = Section.getContents();
|
||||
llvm::Expected<llvm::StringRef> ContentsReference =
|
||||
Section.getContents();
|
||||
if (!ContentsReference) {
|
||||
llvm::errs() << "error: " << name << " "
|
||||
<< errorToErrorCode(OF.takeError()).message() << "\n";
|
||||
<< errorToErrorCode(OF.takeError()).message() << "\n";
|
||||
return false;
|
||||
}
|
||||
char *Module = Alloc.Allocate<char>(Size);
|
||||
|
||||
Reference in New Issue
Block a user