mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
compiler: Update LLVM/Clang driver files to LLVM/Clang 19.
This commit is contained in:
parent
dd095e506a
commit
da8f81c78b
@ -26,6 +26,7 @@
|
|||||||
#include "clang/Frontend/Utils.h"
|
#include "clang/Frontend/Utils.h"
|
||||||
#include "clang/FrontendTool/Utils.h"
|
#include "clang/FrontendTool/Utils.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/Config/llvm-config.h"
|
#include "llvm/Config/llvm-config.h"
|
||||||
#include "llvm/LinkAllPasses.h"
|
#include "llvm/LinkAllPasses.h"
|
||||||
#include "llvm/MC/MCSubtargetInfo.h"
|
#include "llvm/MC/MCSubtargetInfo.h"
|
||||||
@ -39,7 +40,6 @@
|
|||||||
#include "llvm/Support/ManagedStatic.h"
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
#include "llvm/Support/Path.h"
|
#include "llvm/Support/Path.h"
|
||||||
#include "llvm/Support/Process.h"
|
#include "llvm/Support/Process.h"
|
||||||
#include "llvm/Support/RISCVISAInfo.h"
|
|
||||||
#include "llvm/Support/Signals.h"
|
#include "llvm/Support/Signals.h"
|
||||||
#include "llvm/Support/TargetSelect.h"
|
#include "llvm/Support/TargetSelect.h"
|
||||||
#include "llvm/Support/TimeProfiler.h"
|
#include "llvm/Support/TimeProfiler.h"
|
||||||
@ -48,6 +48,7 @@
|
|||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
#include "llvm/TargetParser/AArch64TargetParser.h"
|
#include "llvm/TargetParser/AArch64TargetParser.h"
|
||||||
#include "llvm/TargetParser/ARMTargetParser.h"
|
#include "llvm/TargetParser/ARMTargetParser.h"
|
||||||
|
#include "llvm/TargetParser/RISCVISAInfo.h"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#ifdef CLANG_HAVE_RLIMITS
|
#ifdef CLANG_HAVE_RLIMITS
|
||||||
@ -78,64 +79,6 @@ static void LLVMErrorHandler(void *UserData, const char *Message,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CLANG_HAVE_RLIMITS
|
#ifdef CLANG_HAVE_RLIMITS
|
||||||
#if defined(__linux__) && defined(__PIE__)
|
|
||||||
static size_t getCurrentStackAllocation() {
|
|
||||||
// If we can't compute the current stack usage, allow for 512K of command
|
|
||||||
// line arguments and environment.
|
|
||||||
size_t Usage = 512 * 1024;
|
|
||||||
if (FILE *StatFile = fopen("/proc/self/stat", "r")) {
|
|
||||||
// We assume that the stack extends from its current address to the end of
|
|
||||||
// the environment space. In reality, there is another string literal (the
|
|
||||||
// program name) after the environment, but this is close enough (we only
|
|
||||||
// need to be within 100K or so).
|
|
||||||
unsigned long StackPtr, EnvEnd;
|
|
||||||
// Disable silly GCC -Wformat warning that complains about length
|
|
||||||
// modifiers on ignored format specifiers. We want to retain these
|
|
||||||
// for documentation purposes even though they have no effect.
|
|
||||||
#if defined(__GNUC__) && !defined(__clang__)
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
|
||||||
#endif
|
|
||||||
if (fscanf(StatFile,
|
|
||||||
"%*d %*s %*c %*d %*d %*d %*d %*d %*u %*lu %*lu %*lu %*lu %*lu "
|
|
||||||
"%*lu %*ld %*ld %*ld %*ld %*ld %*ld %*llu %*lu %*ld %*lu %*lu "
|
|
||||||
"%*lu %*lu %lu %*lu %*lu %*lu %*lu %*lu %*llu %*lu %*lu %*d %*d "
|
|
||||||
"%*u %*u %*llu %*lu %*ld %*lu %*lu %*lu %*lu %*lu %*lu %lu %*d",
|
|
||||||
&StackPtr, &EnvEnd) == 2) {
|
|
||||||
#if defined(__GNUC__) && !defined(__clang__)
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
Usage = StackPtr < EnvEnd ? EnvEnd - StackPtr : StackPtr - EnvEnd;
|
|
||||||
}
|
|
||||||
fclose(StatFile);
|
|
||||||
}
|
|
||||||
return Usage;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <alloca.h>
|
|
||||||
|
|
||||||
LLVM_ATTRIBUTE_NOINLINE
|
|
||||||
static void ensureStackAddressSpace() {
|
|
||||||
// Linux kernels prior to 4.1 will sometimes locate the heap of a PIE binary
|
|
||||||
// relatively close to the stack (they are only guaranteed to be 128MiB
|
|
||||||
// apart). This results in crashes if we happen to heap-allocate more than
|
|
||||||
// 128MiB before we reach our stack high-water mark.
|
|
||||||
//
|
|
||||||
// To avoid these crashes, ensure that we have sufficient virtual memory
|
|
||||||
// pages allocated before we start running.
|
|
||||||
size_t Curr = getCurrentStackAllocation();
|
|
||||||
const int kTargetStack = DesiredStackSize - 256 * 1024;
|
|
||||||
if (Curr < kTargetStack) {
|
|
||||||
volatile char *volatile Alloc =
|
|
||||||
static_cast<volatile char *>(alloca(kTargetStack - Curr));
|
|
||||||
Alloc[0] = 0;
|
|
||||||
Alloc[kTargetStack - Curr - 1] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void ensureStackAddressSpace() {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// Attempt to ensure that we have at least 8MiB of usable stack space.
|
/// Attempt to ensure that we have at least 8MiB of usable stack space.
|
||||||
static void ensureSufficientStack() {
|
static void ensureSufficientStack() {
|
||||||
struct rlimit rlim;
|
struct rlimit rlim;
|
||||||
@ -159,10 +102,6 @@ static void ensureSufficientStack() {
|
|||||||
rlim.rlim_cur != DesiredStackSize)
|
rlim.rlim_cur != DesiredStackSize)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We should now have a stack of size at least DesiredStackSize. Ensure
|
|
||||||
// that we can actually use that much, if necessary.
|
|
||||||
ensureStackAddressSpace();
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void ensureSufficientStack() {}
|
static void ensureSufficientStack() {}
|
||||||
@ -208,9 +147,9 @@ static int PrintSupportedExtensions(std::string TargetStr) {
|
|||||||
DescMap.insert({feature.Key, feature.Desc});
|
DescMap.insert({feature.Key, feature.Desc});
|
||||||
|
|
||||||
if (MachineTriple.isRISCV())
|
if (MachineTriple.isRISCV())
|
||||||
llvm::riscvExtensionsHelp(DescMap);
|
llvm::RISCVISAInfo::printSupportedExtensions(DescMap);
|
||||||
else if (MachineTriple.isAArch64())
|
else if (MachineTriple.isAArch64())
|
||||||
llvm::AArch64::PrintSupportedExtensions(DescMap);
|
llvm::AArch64::PrintSupportedExtensions();
|
||||||
else if (MachineTriple.isARM())
|
else if (MachineTriple.isARM())
|
||||||
llvm::ARM::PrintSupportedExtensions(DescMap);
|
llvm::ARM::PrintSupportedExtensions(DescMap);
|
||||||
else {
|
else {
|
||||||
@ -223,6 +162,52 @@ static int PrintSupportedExtensions(std::string TargetStr) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int PrintEnabledExtensions(const TargetOptions& TargetOpts) {
|
||||||
|
std::string Error;
|
||||||
|
const llvm::Target *TheTarget =
|
||||||
|
llvm::TargetRegistry::lookupTarget(TargetOpts.Triple, Error);
|
||||||
|
if (!TheTarget) {
|
||||||
|
llvm::errs() << Error;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a target machine using the input features, the triple information
|
||||||
|
// and a dummy instance of llvm::TargetOptions. Note that this is _not_ the
|
||||||
|
// same as the `clang::TargetOptions` instance we have access to here.
|
||||||
|
llvm::TargetOptions BackendOptions;
|
||||||
|
std::string FeaturesStr = llvm::join(TargetOpts.FeaturesAsWritten, ",");
|
||||||
|
std::unique_ptr<llvm::TargetMachine> TheTargetMachine(
|
||||||
|
TheTarget->createTargetMachine(TargetOpts.Triple, TargetOpts.CPU, FeaturesStr, BackendOptions, std::nullopt));
|
||||||
|
const llvm::Triple &MachineTriple = TheTargetMachine->getTargetTriple();
|
||||||
|
const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo();
|
||||||
|
|
||||||
|
// Extract the feature names that are enabled for the given target.
|
||||||
|
// We do that by capturing the key from the set of SubtargetFeatureKV entries
|
||||||
|
// provided by MCSubtargetInfo, which match the '-target-feature' values.
|
||||||
|
const std::vector<llvm::SubtargetFeatureKV> Features =
|
||||||
|
MCInfo->getEnabledProcessorFeatures();
|
||||||
|
std::set<llvm::StringRef> EnabledFeatureNames;
|
||||||
|
for (const llvm::SubtargetFeatureKV &feature : Features)
|
||||||
|
EnabledFeatureNames.insert(feature.Key);
|
||||||
|
|
||||||
|
if (MachineTriple.isAArch64())
|
||||||
|
llvm::AArch64::printEnabledExtensions(EnabledFeatureNames);
|
||||||
|
else if (MachineTriple.isRISCV()) {
|
||||||
|
llvm::StringMap<llvm::StringRef> DescMap;
|
||||||
|
for (const llvm::SubtargetFeatureKV &feature : Features)
|
||||||
|
DescMap.insert({feature.Key, feature.Desc});
|
||||||
|
llvm::RISCVISAInfo::printEnabledExtensions(MachineTriple.isArch64Bit(),
|
||||||
|
EnabledFeatureNames, DescMap);
|
||||||
|
} else {
|
||||||
|
// The option was already checked in Driver::HandleImmediateArgs,
|
||||||
|
// so we do not expect to get here if we are not a supported architecture.
|
||||||
|
assert(0 && "Unhandled triple for --print-enabled-extensions option.");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
|
int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
|
||||||
ensureSufficientStack();
|
ensureSufficientStack();
|
||||||
|
|
||||||
@ -256,7 +241,8 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
|
|||||||
|
|
||||||
if (!Clang->getFrontendOpts().TimeTracePath.empty()) {
|
if (!Clang->getFrontendOpts().TimeTracePath.empty()) {
|
||||||
llvm::timeTraceProfilerInitialize(
|
llvm::timeTraceProfilerInitialize(
|
||||||
Clang->getFrontendOpts().TimeTraceGranularity, Argv0);
|
Clang->getFrontendOpts().TimeTraceGranularity, Argv0,
|
||||||
|
Clang->getFrontendOpts().TimeTraceVerbose);
|
||||||
}
|
}
|
||||||
// --print-supported-cpus takes priority over the actual compilation.
|
// --print-supported-cpus takes priority over the actual compilation.
|
||||||
if (Clang->getFrontendOpts().PrintSupportedCPUs)
|
if (Clang->getFrontendOpts().PrintSupportedCPUs)
|
||||||
@ -266,6 +252,10 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
|
|||||||
if (Clang->getFrontendOpts().PrintSupportedExtensions)
|
if (Clang->getFrontendOpts().PrintSupportedExtensions)
|
||||||
return PrintSupportedExtensions(Clang->getTargetOpts().Triple);
|
return PrintSupportedExtensions(Clang->getTargetOpts().Triple);
|
||||||
|
|
||||||
|
// --print-enabled-extensions takes priority over the actual compilation.
|
||||||
|
if (Clang->getFrontendOpts().PrintEnabledExtensions)
|
||||||
|
return PrintEnabledExtensions(Clang->getTargetOpts());
|
||||||
|
|
||||||
// Infer the builtin include path if unspecified.
|
// Infer the builtin include path if unspecified.
|
||||||
if (Clang->getHeaderSearchOpts().UseBuiltinIncludes &&
|
if (Clang->getHeaderSearchOpts().UseBuiltinIncludes &&
|
||||||
Clang->getHeaderSearchOpts().ResourceDir.empty())
|
Clang->getHeaderSearchOpts().ResourceDir.empty())
|
||||||
|
|||||||
@ -89,10 +89,17 @@ struct AssemblerInvocation {
|
|||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
std::vector<std::string> IncludePaths;
|
std::vector<std::string> IncludePaths;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned NoInitialTextSection : 1;
|
unsigned NoInitialTextSection : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned SaveTemporaryLabels : 1;
|
unsigned SaveTemporaryLabels : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned GenDwarfForAssembly : 1;
|
unsigned GenDwarfForAssembly : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned RelaxELFRelocations : 1;
|
unsigned RelaxELFRelocations : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
|
unsigned SSE2AVX : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned Dwarf64 : 1;
|
unsigned Dwarf64 : 1;
|
||||||
unsigned DwarfVersion;
|
unsigned DwarfVersion;
|
||||||
std::string DwarfDebugFlags;
|
std::string DwarfDebugFlags;
|
||||||
@ -117,7 +124,9 @@ struct AssemblerInvocation {
|
|||||||
FT_Obj ///< Object file output.
|
FT_Obj ///< Object file output.
|
||||||
};
|
};
|
||||||
FileType OutputType;
|
FileType OutputType;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned ShowHelp : 1;
|
unsigned ShowHelp : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned ShowVersion : 1;
|
unsigned ShowVersion : 1;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
@ -125,19 +134,28 @@ struct AssemblerInvocation {
|
|||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
unsigned OutputAsmVariant;
|
unsigned OutputAsmVariant;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned ShowEncoding : 1;
|
unsigned ShowEncoding : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned ShowInst : 1;
|
unsigned ShowInst : 1;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
/// @name Assembler Options
|
/// @name Assembler Options
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned RelaxAll : 1;
|
unsigned RelaxAll : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned NoExecStack : 1;
|
unsigned NoExecStack : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned FatalWarnings : 1;
|
unsigned FatalWarnings : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned NoWarn : 1;
|
unsigned NoWarn : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned NoTypeCheck : 1;
|
unsigned NoTypeCheck : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned IncrementalLinkerCompatible : 1;
|
unsigned IncrementalLinkerCompatible : 1;
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned EmbedBitcode : 1;
|
unsigned EmbedBitcode : 1;
|
||||||
|
|
||||||
/// Whether to emit DWARF unwind info.
|
/// Whether to emit DWARF unwind info.
|
||||||
@ -145,8 +163,12 @@ struct AssemblerInvocation {
|
|||||||
|
|
||||||
// Whether to emit compact-unwind for non-canonical entries.
|
// Whether to emit compact-unwind for non-canonical entries.
|
||||||
// Note: maybe overriden by other constraints.
|
// Note: maybe overriden by other constraints.
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
unsigned EmitCompactUnwindNonCanonical : 1;
|
unsigned EmitCompactUnwindNonCanonical : 1;
|
||||||
|
|
||||||
|
LLVM_PREFERRED_TYPE(bool)
|
||||||
|
unsigned Crel : 1;
|
||||||
|
|
||||||
/// The name of the relocation model to use.
|
/// The name of the relocation model to use.
|
||||||
std::string RelocationModel;
|
std::string RelocationModel;
|
||||||
|
|
||||||
@ -177,6 +199,7 @@ public:
|
|||||||
ShowInst = 0;
|
ShowInst = 0;
|
||||||
ShowEncoding = 0;
|
ShowEncoding = 0;
|
||||||
RelaxAll = 0;
|
RelaxAll = 0;
|
||||||
|
SSE2AVX = 0;
|
||||||
NoExecStack = 0;
|
NoExecStack = 0;
|
||||||
FatalWarnings = 0;
|
FatalWarnings = 0;
|
||||||
NoWarn = 0;
|
NoWarn = 0;
|
||||||
@ -187,6 +210,7 @@ public:
|
|||||||
EmbedBitcode = 0;
|
EmbedBitcode = 0;
|
||||||
EmitDwarfUnwind = EmitDwarfUnwindType::Default;
|
EmitDwarfUnwind = EmitDwarfUnwindType::Default;
|
||||||
EmitCompactUnwindNonCanonical = false;
|
EmitCompactUnwindNonCanonical = false;
|
||||||
|
Crel = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CreateFromArgs(AssemblerInvocation &Res,
|
static bool CreateFromArgs(AssemblerInvocation &Res,
|
||||||
@ -267,6 +291,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Opts.RelaxELFRelocations = !Args.hasArg(OPT_mrelax_relocations_no);
|
Opts.RelaxELFRelocations = !Args.hasArg(OPT_mrelax_relocations_no);
|
||||||
|
Opts.SSE2AVX = Args.hasArg(OPT_msse2avx);
|
||||||
if (auto *DwarfFormatArg = Args.getLastArg(OPT_gdwarf64, OPT_gdwarf32))
|
if (auto *DwarfFormatArg = Args.getLastArg(OPT_gdwarf64, OPT_gdwarf32))
|
||||||
Opts.Dwarf64 = DwarfFormatArg->getOption().matches(OPT_gdwarf64);
|
Opts.Dwarf64 = DwarfFormatArg->getOption().matches(OPT_gdwarf64);
|
||||||
Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);
|
Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);
|
||||||
@ -356,6 +381,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
|
|||||||
|
|
||||||
Opts.EmitCompactUnwindNonCanonical =
|
Opts.EmitCompactUnwindNonCanonical =
|
||||||
Args.hasArg(OPT_femit_compact_unwind_non_canonical);
|
Args.hasArg(OPT_femit_compact_unwind_non_canonical);
|
||||||
|
Opts.Crel = Args.hasArg(OPT_crel);
|
||||||
|
|
||||||
Opts.AsSecureLogFile = Args.getLastArgValue(OPT_as_secure_log_file);
|
Opts.AsSecureLogFile = Args.getLastArgValue(OPT_as_secure_log_file);
|
||||||
|
|
||||||
@ -409,8 +435,14 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
|||||||
assert(MRI && "Unable to create target register info!");
|
assert(MRI && "Unable to create target register info!");
|
||||||
|
|
||||||
MCTargetOptions MCOptions;
|
MCTargetOptions MCOptions;
|
||||||
|
MCOptions.MCRelaxAll = Opts.RelaxAll;
|
||||||
MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind;
|
MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind;
|
||||||
MCOptions.EmitCompactUnwindNonCanonical = Opts.EmitCompactUnwindNonCanonical;
|
MCOptions.EmitCompactUnwindNonCanonical = Opts.EmitCompactUnwindNonCanonical;
|
||||||
|
MCOptions.MCSaveTempLabels = Opts.SaveTemporaryLabels;
|
||||||
|
MCOptions.Crel = Opts.Crel;
|
||||||
|
MCOptions.X86RelaxRelocations = Opts.RelaxELFRelocations;
|
||||||
|
MCOptions.X86Sse2Avx = Opts.SSE2AVX;
|
||||||
|
MCOptions.CompressDebugSections = Opts.CompressDebugSections;
|
||||||
MCOptions.AsSecureLogFile = Opts.AsSecureLogFile;
|
MCOptions.AsSecureLogFile = Opts.AsSecureLogFile;
|
||||||
|
|
||||||
std::unique_ptr<MCAsmInfo> MAI(
|
std::unique_ptr<MCAsmInfo> MAI(
|
||||||
@ -419,9 +451,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
|||||||
|
|
||||||
// Ensure MCAsmInfo initialization occurs before any use, otherwise sections
|
// Ensure MCAsmInfo initialization occurs before any use, otherwise sections
|
||||||
// may be created with a combination of default and explicit settings.
|
// may be created with a combination of default and explicit settings.
|
||||||
MAI->setCompressDebugSections(Opts.CompressDebugSections);
|
|
||||||
|
|
||||||
MAI->setRelaxELFRelocations(Opts.RelaxELFRelocations);
|
|
||||||
|
|
||||||
bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj;
|
bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj;
|
||||||
if (Opts.OutputPath.empty())
|
if (Opts.OutputPath.empty())
|
||||||
@ -465,8 +495,6 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
|||||||
MOFI->setDarwinTargetVariantSDKVersion(Opts.DarwinTargetVariantSDKVersion);
|
MOFI->setDarwinTargetVariantSDKVersion(Opts.DarwinTargetVariantSDKVersion);
|
||||||
Ctx.setObjectFileInfo(MOFI.get());
|
Ctx.setObjectFileInfo(MOFI.get());
|
||||||
|
|
||||||
if (Opts.SaveTemporaryLabels)
|
|
||||||
Ctx.setAllowTemporaryLabels(false);
|
|
||||||
if (Opts.GenDwarfForAssembly)
|
if (Opts.GenDwarfForAssembly)
|
||||||
Ctx.setGenDwarfForAssembly(true);
|
Ctx.setGenDwarfForAssembly(true);
|
||||||
if (!Opts.DwarfDebugFlags.empty())
|
if (!Opts.DwarfDebugFlags.empty())
|
||||||
@ -503,6 +531,9 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
|||||||
MCOptions.MCNoWarn = Opts.NoWarn;
|
MCOptions.MCNoWarn = Opts.NoWarn;
|
||||||
MCOptions.MCFatalWarnings = Opts.FatalWarnings;
|
MCOptions.MCFatalWarnings = Opts.FatalWarnings;
|
||||||
MCOptions.MCNoTypeCheck = Opts.NoTypeCheck;
|
MCOptions.MCNoTypeCheck = Opts.NoTypeCheck;
|
||||||
|
MCOptions.ShowMCInst = Opts.ShowInst;
|
||||||
|
MCOptions.AsmVerbose = true;
|
||||||
|
MCOptions.MCUseDwarfDirectory = MCTargetOptions::EnableDwarfDirectory;
|
||||||
MCOptions.ABIName = Opts.TargetABI;
|
MCOptions.ABIName = Opts.TargetABI;
|
||||||
|
|
||||||
// FIXME: There is a bit of code duplication with addPassesToEmitFile.
|
// FIXME: There is a bit of code duplication with addPassesToEmitFile.
|
||||||
@ -517,10 +548,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
|||||||
TheTarget->createMCAsmBackend(*STI, *MRI, MCOptions));
|
TheTarget->createMCAsmBackend(*STI, *MRI, MCOptions));
|
||||||
|
|
||||||
auto FOut = std::make_unique<formatted_raw_ostream>(*Out);
|
auto FOut = std::make_unique<formatted_raw_ostream>(*Out);
|
||||||
Str.reset(TheTarget->createAsmStreamer(
|
Str.reset(TheTarget->createAsmStreamer(Ctx, std::move(FOut), IP,
|
||||||
Ctx, std::move(FOut), /*asmverbose*/ true,
|
std::move(CE), std::move(MAB)));
|
||||||
/*useDwarfDirectory*/ true, IP, std::move(CE), std::move(MAB),
|
|
||||||
Opts.ShowInst));
|
|
||||||
} else if (Opts.OutputType == AssemblerInvocation::FT_Null) {
|
} else if (Opts.OutputType == AssemblerInvocation::FT_Null) {
|
||||||
Str.reset(createNullStreamer(Ctx));
|
Str.reset(createNullStreamer(Ctx));
|
||||||
} else {
|
} else {
|
||||||
@ -543,9 +572,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
|||||||
|
|
||||||
Triple T(Opts.Triple);
|
Triple T(Opts.Triple);
|
||||||
Str.reset(TheTarget->createMCObjectStreamer(
|
Str.reset(TheTarget->createMCObjectStreamer(
|
||||||
T, Ctx, std::move(MAB), std::move(OW), std::move(CE), *STI,
|
T, Ctx, std::move(MAB), std::move(OW), std::move(CE), *STI));
|
||||||
Opts.RelaxAll, Opts.IncrementalLinkerCompatible,
|
|
||||||
/*DWARFMustBeAtTheEnd*/ true));
|
|
||||||
Str.get()->initSections(Opts.NoExecStack, *STI);
|
Str.get()->initSections(Opts.NoExecStack, *STI);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,9 +585,6 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
|||||||
Str.get()->emitZeros(1);
|
Str.get()->emitZeros(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assembly to object compilation should leverage assembly info.
|
|
||||||
Str->setUseAssemblerInfoForParsing(true);
|
|
||||||
|
|
||||||
bool Failed = false;
|
bool Failed = false;
|
||||||
|
|
||||||
std::unique_ptr<MCAsmParser> Parser(
|
std::unique_ptr<MCAsmParser> Parser(
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
#include "llvm/ADT/ArrayRef.h"
|
#include "llvm/ADT/ArrayRef.h"
|
||||||
#include "llvm/ADT/SmallString.h"
|
#include "llvm/ADT/SmallString.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
|
#include "llvm/ADT/StringSet.h"
|
||||||
#include "llvm/Option/ArgList.h"
|
#include "llvm/Option/ArgList.h"
|
||||||
#include "llvm/Option/OptTable.h"
|
#include "llvm/Option/OptTable.h"
|
||||||
#include "llvm/Option/Option.h"
|
#include "llvm/Option/Option.h"
|
||||||
@ -41,7 +42,6 @@
|
|||||||
#include "llvm/Support/PrettyStackTrace.h"
|
#include "llvm/Support/PrettyStackTrace.h"
|
||||||
#include "llvm/Support/Process.h"
|
#include "llvm/Support/Process.h"
|
||||||
#include "llvm/Support/Program.h"
|
#include "llvm/Support/Program.h"
|
||||||
#include "llvm/Support/Regex.h"
|
|
||||||
#include "llvm/Support/Signals.h"
|
#include "llvm/Support/Signals.h"
|
||||||
#include "llvm/Support/StringSaver.h"
|
#include "llvm/Support/StringSaver.h"
|
||||||
#include "llvm/Support/TargetSelect.h"
|
#include "llvm/Support/TargetSelect.h"
|
||||||
@ -73,136 +73,8 @@ std::string GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) {
|
|||||||
return llvm::sys::fs::getMainExecutable(Argv0, P);
|
return llvm::sys::fs::getMainExecutable(Argv0, P);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *GetStableCStr(std::set<std::string> &SavedStrings,
|
static const char *GetStableCStr(llvm::StringSet<> &SavedStrings, StringRef S) {
|
||||||
StringRef S) {
|
return SavedStrings.insert(S).first->getKeyData();
|
||||||
return SavedStrings.insert(std::string(S)).first->c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ApplyOneQAOverride - Apply a list of edits to the input argument lists.
|
|
||||||
///
|
|
||||||
/// The input string is a space separated list of edits to perform,
|
|
||||||
/// they are applied in order to the input argument lists. Edits
|
|
||||||
/// should be one of the following forms:
|
|
||||||
///
|
|
||||||
/// '#': Silence information about the changes to the command line arguments.
|
|
||||||
///
|
|
||||||
/// '^': Add FOO as a new argument at the beginning of the command line.
|
|
||||||
///
|
|
||||||
/// '+': Add FOO as a new argument at the end of the command line.
|
|
||||||
///
|
|
||||||
/// 's/XXX/YYY/': Substitute the regular expression XXX with YYY in the command
|
|
||||||
/// line.
|
|
||||||
///
|
|
||||||
/// 'xOPTION': Removes all instances of the literal argument OPTION.
|
|
||||||
///
|
|
||||||
/// 'XOPTION': Removes all instances of the literal argument OPTION,
|
|
||||||
/// and the following argument.
|
|
||||||
///
|
|
||||||
/// 'Ox': Removes all flags matching 'O' or 'O[sz0-9]' and adds 'Ox'
|
|
||||||
/// at the end of the command line.
|
|
||||||
///
|
|
||||||
/// \param OS - The stream to write edit information to.
|
|
||||||
/// \param Args - The vector of command line arguments.
|
|
||||||
/// \param Edit - The override command to perform.
|
|
||||||
/// \param SavedStrings - Set to use for storing string representations.
|
|
||||||
static void ApplyOneQAOverride(raw_ostream &OS,
|
|
||||||
SmallVectorImpl<const char*> &Args,
|
|
||||||
StringRef Edit,
|
|
||||||
std::set<std::string> &SavedStrings) {
|
|
||||||
// This does not need to be efficient.
|
|
||||||
|
|
||||||
if (Edit[0] == '^') {
|
|
||||||
const char *Str =
|
|
||||||
GetStableCStr(SavedStrings, Edit.substr(1));
|
|
||||||
OS << "### Adding argument " << Str << " at beginning\n";
|
|
||||||
Args.insert(Args.begin() + 1, Str);
|
|
||||||
} else if (Edit[0] == '+') {
|
|
||||||
const char *Str =
|
|
||||||
GetStableCStr(SavedStrings, Edit.substr(1));
|
|
||||||
OS << "### Adding argument " << Str << " at end\n";
|
|
||||||
Args.push_back(Str);
|
|
||||||
} else if (Edit[0] == 's' && Edit[1] == '/' && Edit.ends_with("/") &&
|
|
||||||
Edit.slice(2, Edit.size() - 1).contains('/')) {
|
|
||||||
StringRef MatchPattern = Edit.substr(2).split('/').first;
|
|
||||||
StringRef ReplPattern = Edit.substr(2).split('/').second;
|
|
||||||
ReplPattern = ReplPattern.slice(0, ReplPattern.size()-1);
|
|
||||||
|
|
||||||
for (unsigned i = 1, e = Args.size(); i != e; ++i) {
|
|
||||||
// Ignore end-of-line response file markers
|
|
||||||
if (Args[i] == nullptr)
|
|
||||||
continue;
|
|
||||||
std::string Repl = llvm::Regex(MatchPattern).sub(ReplPattern, Args[i]);
|
|
||||||
|
|
||||||
if (Repl != Args[i]) {
|
|
||||||
OS << "### Replacing '" << Args[i] << "' with '" << Repl << "'\n";
|
|
||||||
Args[i] = GetStableCStr(SavedStrings, Repl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (Edit[0] == 'x' || Edit[0] == 'X') {
|
|
||||||
auto Option = Edit.substr(1);
|
|
||||||
for (unsigned i = 1; i < Args.size();) {
|
|
||||||
if (Option == Args[i]) {
|
|
||||||
OS << "### Deleting argument " << Args[i] << '\n';
|
|
||||||
Args.erase(Args.begin() + i);
|
|
||||||
if (Edit[0] == 'X') {
|
|
||||||
if (i < Args.size()) {
|
|
||||||
OS << "### Deleting argument " << Args[i] << '\n';
|
|
||||||
Args.erase(Args.begin() + i);
|
|
||||||
} else
|
|
||||||
OS << "### Invalid X edit, end of command line!\n";
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
} else if (Edit[0] == 'O') {
|
|
||||||
for (unsigned i = 1; i < Args.size();) {
|
|
||||||
const char *A = Args[i];
|
|
||||||
// Ignore end-of-line response file markers
|
|
||||||
if (A == nullptr)
|
|
||||||
continue;
|
|
||||||
if (A[0] == '-' && A[1] == 'O' &&
|
|
||||||
(A[2] == '\0' ||
|
|
||||||
(A[3] == '\0' && (A[2] == 's' || A[2] == 'z' ||
|
|
||||||
('0' <= A[2] && A[2] <= '9'))))) {
|
|
||||||
OS << "### Deleting argument " << Args[i] << '\n';
|
|
||||||
Args.erase(Args.begin() + i);
|
|
||||||
} else
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
OS << "### Adding argument " << Edit << " at end\n";
|
|
||||||
Args.push_back(GetStableCStr(SavedStrings, '-' + Edit.str()));
|
|
||||||
} else {
|
|
||||||
OS << "### Unrecognized edit: " << Edit << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ApplyQAOverride - Apply a space separated list of edits to the
|
|
||||||
/// input argument lists. See ApplyOneQAOverride.
|
|
||||||
static void ApplyQAOverride(SmallVectorImpl<const char*> &Args,
|
|
||||||
const char *OverrideStr,
|
|
||||||
std::set<std::string> &SavedStrings) {
|
|
||||||
raw_ostream *OS = &llvm::errs();
|
|
||||||
|
|
||||||
if (OverrideStr[0] == '#') {
|
|
||||||
++OverrideStr;
|
|
||||||
OS = &llvm::nulls();
|
|
||||||
}
|
|
||||||
|
|
||||||
*OS << "### CCC_OVERRIDE_OPTIONS: " << OverrideStr << "\n";
|
|
||||||
|
|
||||||
// This does not need to be efficient.
|
|
||||||
|
|
||||||
const char *S = OverrideStr;
|
|
||||||
while (*S) {
|
|
||||||
const char *End = ::strchr(S, ' ');
|
|
||||||
if (!End)
|
|
||||||
End = S + strlen(S);
|
|
||||||
if (End != S)
|
|
||||||
ApplyOneQAOverride(*OS, Args, std::string(S, End), SavedStrings);
|
|
||||||
S = End;
|
|
||||||
if (*S != '\0')
|
|
||||||
++S;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int cc1_main(ArrayRef<const char *> Argv, const char *Argv0,
|
extern int cc1_main(ArrayRef<const char *> Argv, const char *Argv0,
|
||||||
@ -212,7 +84,7 @@ extern int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0,
|
|||||||
|
|
||||||
static void insertTargetAndModeArgs(const ParsedClangName &NameParts,
|
static void insertTargetAndModeArgs(const ParsedClangName &NameParts,
|
||||||
SmallVectorImpl<const char *> &ArgVector,
|
SmallVectorImpl<const char *> &ArgVector,
|
||||||
std::set<std::string> &SavedStrings) {
|
llvm::StringSet<> &SavedStrings) {
|
||||||
// Put target and mode arguments at the start of argument list so that
|
// Put target and mode arguments at the start of argument list so that
|
||||||
// arguments specified in command line could override them. Avoid putting
|
// arguments specified in command line could override them. Avoid putting
|
||||||
// them at index 0, as an option like '-cc1' must remain the first.
|
// them at index 0, as an option like '-cc1' must remain the first.
|
||||||
@ -320,28 +192,6 @@ static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,
|
|||||||
DiagClient->setPrefix(std::string(ExeBasename));
|
DiagClient->setPrefix(std::string(ExeBasename));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetInstallDir(SmallVectorImpl<const char *> &argv,
|
|
||||||
Driver &TheDriver, bool CanonicalPrefixes) {
|
|
||||||
// Attempt to find the original path used to invoke the driver, to determine
|
|
||||||
// the installed path. We do this manually, because we want to support that
|
|
||||||
// path being a symlink.
|
|
||||||
SmallString<128> InstalledPath(argv[0]);
|
|
||||||
|
|
||||||
// Do a PATH lookup, if there are no directory components.
|
|
||||||
if (llvm::sys::path::filename(InstalledPath) == InstalledPath)
|
|
||||||
if (llvm::ErrorOr<std::string> Tmp = llvm::sys::findProgramByName(
|
|
||||||
llvm::sys::path::filename(InstalledPath.str())))
|
|
||||||
InstalledPath = *Tmp;
|
|
||||||
|
|
||||||
// FIXME: We don't actually canonicalize this, we just make it absolute.
|
|
||||||
if (CanonicalPrefixes)
|
|
||||||
llvm::sys::fs::make_absolute(InstalledPath);
|
|
||||||
|
|
||||||
StringRef InstalledPathParent(llvm::sys::path::parent_path(InstalledPath));
|
|
||||||
if (llvm::sys::fs::exists(InstalledPathParent))
|
|
||||||
TheDriver.setInstalledDir(InstalledPathParent);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV,
|
static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV,
|
||||||
const llvm::ToolContext &ToolContext) {
|
const llvm::ToolContext &ToolContext) {
|
||||||
// If we call the cc1 tool from the clangDriver library (through
|
// If we call the cc1 tool from the clangDriver library (through
|
||||||
@ -363,8 +213,9 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV,
|
|||||||
if (Tool == "-cc1as")
|
if (Tool == "-cc1as")
|
||||||
return cc1as_main(ArrayRef(ArgV).slice(2), ArgV[0], GetExecutablePathVP);
|
return cc1as_main(ArrayRef(ArgV).slice(2), ArgV[0], GetExecutablePathVP);
|
||||||
// Reject unknown tools.
|
// Reject unknown tools.
|
||||||
llvm::errs() << "error: unknown integrated tool '" << Tool << "'. "
|
llvm::errs()
|
||||||
<< "Valid tools include '-cc1' and '-cc1as'.\n";
|
<< "error: unknown integrated tool '" << Tool << "'. "
|
||||||
|
<< "Valid tools include '-cc1' and '-cc1as'.\n";
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,12 +286,13 @@ static int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContex
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> SavedStrings;
|
llvm::StringSet<> SavedStrings;
|
||||||
// Handle CCC_OVERRIDE_OPTIONS, used for editing a command line behind the
|
// Handle CCC_OVERRIDE_OPTIONS, used for editing a command line behind the
|
||||||
// scenes.
|
// scenes.
|
||||||
if (const char *OverrideStr = ::getenv("CCC_OVERRIDE_OPTIONS")) {
|
if (const char *OverrideStr = ::getenv("CCC_OVERRIDE_OPTIONS")) {
|
||||||
// FIXME: Driver shouldn't take extra initial argument.
|
// FIXME: Driver shouldn't take extra initial argument.
|
||||||
ApplyQAOverride(Args, OverrideStr, SavedStrings);
|
driver::applyOverrideOptions(Args, OverrideStr, SavedStrings,
|
||||||
|
&llvm::errs());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Path = GetExecutablePath(ToolContext.Path, CanonicalPrefixes);
|
std::string Path = GetExecutablePath(ToolContext.Path, CanonicalPrefixes);
|
||||||
@ -478,7 +330,6 @@ static int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContex
|
|||||||
ProcessWarningOptions(Diags, *DiagOpts, /*ReportDiags=*/false);
|
ProcessWarningOptions(Diags, *DiagOpts, /*ReportDiags=*/false);
|
||||||
|
|
||||||
Driver TheDriver(Path, llvm::sys::getDefaultTargetTriple(), Diags);
|
Driver TheDriver(Path, llvm::sys::getDefaultTargetTriple(), Diags);
|
||||||
SetInstallDir(Args, TheDriver, CanonicalPrefixes);
|
|
||||||
auto TargetAndMode = ToolChain::getTargetAndModeFromProgramName(ProgName);
|
auto TargetAndMode = ToolChain::getTargetAndModeFromProgramName(ProgName);
|
||||||
TheDriver.setTargetAndMode(TargetAndMode);
|
TheDriver.setTargetAndMode(TargetAndMode);
|
||||||
// If -canonical-prefixes is set, GetExecutablePath will have resolved Path
|
// If -canonical-prefixes is set, GetExecutablePath will have resolved Path
|
||||||
|
|||||||
@ -65,7 +65,7 @@ static void printRanLibHelp(StringRef ToolName) {
|
|||||||
<< "USAGE: " + ToolName + " archive...\n\n"
|
<< "USAGE: " + ToolName + " archive...\n\n"
|
||||||
<< "OPTIONS:\n"
|
<< "OPTIONS:\n"
|
||||||
<< " -h --help - Display available options\n"
|
<< " -h --help - Display available options\n"
|
||||||
<< " -v --version - Display the version of this program\n"
|
<< " -V --version - Display the version of this program\n"
|
||||||
<< " -D - Use zero for timestamps and uids/gids "
|
<< " -D - Use zero for timestamps and uids/gids "
|
||||||
"(default)\n"
|
"(default)\n"
|
||||||
<< " -U - Use actual timestamps and uids/gids\n"
|
<< " -U - Use actual timestamps and uids/gids\n"
|
||||||
@ -82,6 +82,7 @@ static void printArHelp(StringRef ToolName) {
|
|||||||
=darwin - darwin
|
=darwin - darwin
|
||||||
=bsd - bsd
|
=bsd - bsd
|
||||||
=bigarchive - big archive (AIX OS)
|
=bigarchive - big archive (AIX OS)
|
||||||
|
=coff - coff
|
||||||
--plugin=<string> - ignored for compatibility
|
--plugin=<string> - ignored for compatibility
|
||||||
-h --help - display this help and exit
|
-h --help - display this help and exit
|
||||||
--output - the directory to extract archive members to
|
--output - the directory to extract archive members to
|
||||||
@ -193,7 +194,7 @@ static SmallVector<const char *, 256> PositionalArgs;
|
|||||||
static bool MRI;
|
static bool MRI;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
enum Format { Default, GNU, BSD, DARWIN, BIGARCHIVE, Unknown };
|
enum Format { Default, GNU, COFF, BSD, DARWIN, BIGARCHIVE, Unknown };
|
||||||
}
|
}
|
||||||
|
|
||||||
static Format FormatType = Default;
|
static Format FormatType = Default;
|
||||||
@ -670,7 +671,7 @@ Expected<std::unique_ptr<Binary>> getAsBinary(const Archive::Child &C,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class A> static bool isValidInBitMode(const A &Member) {
|
template <class A> static bool isValidInBitMode(const A &Member) {
|
||||||
if (object::Archive::getDefaultKindForHost() != object::Archive::K_AIXBIG)
|
if (object::Archive::getDefaultKind() != object::Archive::K_AIXBIG)
|
||||||
return true;
|
return true;
|
||||||
LLVMContext Context;
|
LLVMContext Context;
|
||||||
Expected<std::unique_ptr<Binary>> BinOrErr = getAsBinary(Member, &Context);
|
Expected<std::unique_ptr<Binary>> BinOrErr = getAsBinary(Member, &Context);
|
||||||
@ -1025,25 +1026,35 @@ static void performWriteOperation(ArchiveOperation Operation,
|
|||||||
Kind = object::Archive::K_GNU;
|
Kind = object::Archive::K_GNU;
|
||||||
else if (OldArchive) {
|
else if (OldArchive) {
|
||||||
Kind = OldArchive->kind();
|
Kind = OldArchive->kind();
|
||||||
if (Kind == object::Archive::K_BSD) {
|
std::optional<object::Archive::Kind> AltKind;
|
||||||
auto InferredKind = object::Archive::K_BSD;
|
if (Kind == object::Archive::K_BSD)
|
||||||
|
AltKind = object::Archive::K_DARWIN;
|
||||||
|
else if (Kind == object::Archive::K_GNU && !OldArchive->hasSymbolTable())
|
||||||
|
// If there is no symbol table, we can't tell GNU from COFF format
|
||||||
|
// from the old archive type.
|
||||||
|
AltKind = object::Archive::K_COFF;
|
||||||
|
if (AltKind) {
|
||||||
|
auto InferredKind = Kind;
|
||||||
if (NewMembersP && !NewMembersP->empty())
|
if (NewMembersP && !NewMembersP->empty())
|
||||||
InferredKind = NewMembersP->front().detectKindFromObject();
|
InferredKind = NewMembersP->front().detectKindFromObject();
|
||||||
else if (!NewMembers.empty())
|
else if (!NewMembers.empty())
|
||||||
InferredKind = NewMembers.front().detectKindFromObject();
|
InferredKind = NewMembers.front().detectKindFromObject();
|
||||||
if (InferredKind == object::Archive::K_DARWIN)
|
if (InferredKind == AltKind)
|
||||||
Kind = object::Archive::K_DARWIN;
|
Kind = *AltKind;
|
||||||
}
|
}
|
||||||
} else if (NewMembersP)
|
} else if (NewMembersP)
|
||||||
Kind = !NewMembersP->empty() ? NewMembersP->front().detectKindFromObject()
|
Kind = !NewMembersP->empty() ? NewMembersP->front().detectKindFromObject()
|
||||||
: object::Archive::getDefaultKindForHost();
|
: object::Archive::getDefaultKind();
|
||||||
else
|
else
|
||||||
Kind = !NewMembers.empty() ? NewMembers.front().detectKindFromObject()
|
Kind = !NewMembers.empty() ? NewMembers.front().detectKindFromObject()
|
||||||
: object::Archive::getDefaultKindForHost();
|
: object::Archive::getDefaultKind();
|
||||||
break;
|
break;
|
||||||
case GNU:
|
case GNU:
|
||||||
Kind = object::Archive::K_GNU;
|
Kind = object::Archive::K_GNU;
|
||||||
break;
|
break;
|
||||||
|
case COFF:
|
||||||
|
Kind = object::Archive::K_COFF;
|
||||||
|
break;
|
||||||
case BSD:
|
case BSD:
|
||||||
if (Thin)
|
if (Thin)
|
||||||
fail("only the gnu format has a thin mode");
|
fail("only the gnu format has a thin mode");
|
||||||
@ -1331,7 +1342,7 @@ static int ar_main(int argc, char **argv) {
|
|||||||
|
|
||||||
// Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if
|
// Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if
|
||||||
// specified.
|
// specified.
|
||||||
if (object::Archive::getDefaultKindForHost() == object::Archive::K_AIXBIG) {
|
if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) {
|
||||||
BitMode = getBitMode(getenv("OBJECT_MODE"));
|
BitMode = getBitMode(getenv("OBJECT_MODE"));
|
||||||
if (BitMode == BitModeTy::Unknown)
|
if (BitMode == BitModeTy::Unknown)
|
||||||
BitMode = BitModeTy::Bit32;
|
BitMode = BitModeTy::Bit32;
|
||||||
@ -1376,6 +1387,7 @@ static int ar_main(int argc, char **argv) {
|
|||||||
.Case("darwin", DARWIN)
|
.Case("darwin", DARWIN)
|
||||||
.Case("bsd", BSD)
|
.Case("bsd", BSD)
|
||||||
.Case("bigarchive", BIGARCHIVE)
|
.Case("bigarchive", BIGARCHIVE)
|
||||||
|
.Case("coff", COFF)
|
||||||
.Default(Unknown);
|
.Default(Unknown);
|
||||||
if (FormatType == Unknown)
|
if (FormatType == Unknown)
|
||||||
fail(std::string("Invalid format ") + Match);
|
fail(std::string("Invalid format ") + Match);
|
||||||
@ -1392,8 +1404,7 @@ static int ar_main(int argc, char **argv) {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (strncmp(*ArgIt, "-X", 2) == 0) {
|
if (strncmp(*ArgIt, "-X", 2) == 0) {
|
||||||
if (object::Archive::getDefaultKindForHost() ==
|
if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) {
|
||||||
object::Archive::K_AIXBIG) {
|
|
||||||
Match = *(*ArgIt + 2) != '\0' ? *ArgIt + 2 : *(++ArgIt);
|
Match = *(*ArgIt + 2) != '\0' ? *ArgIt + 2 : *(++ArgIt);
|
||||||
BitMode = getBitMode(Match);
|
BitMode = getBitMode(Match);
|
||||||
if (BitMode == BitModeTy::Unknown)
|
if (BitMode == BitModeTy::Unknown)
|
||||||
@ -1428,12 +1439,11 @@ static int ranlib_main(int argc, char **argv) {
|
|||||||
} else if (arg.front() == 'h') {
|
} else if (arg.front() == 'h') {
|
||||||
printHelpMessage();
|
printHelpMessage();
|
||||||
return 0;
|
return 0;
|
||||||
} else if (arg.front() == 'v') {
|
} else if (arg.front() == 'V') {
|
||||||
cl::PrintVersionMessage();
|
cl::PrintVersionMessage();
|
||||||
return 0;
|
return 0;
|
||||||
} else if (arg.front() == 'X') {
|
} else if (arg.front() == 'X') {
|
||||||
if (object::Archive::getDefaultKindForHost() ==
|
if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) {
|
||||||
object::Archive::K_AIXBIG) {
|
|
||||||
HasAIXXOption = true;
|
HasAIXXOption = true;
|
||||||
arg.consume_front("X");
|
arg.consume_front("X");
|
||||||
const char *Xarg = arg.data();
|
const char *Xarg = arg.data();
|
||||||
@ -1464,7 +1474,7 @@ static int ranlib_main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (object::Archive::getDefaultKindForHost() == object::Archive::K_AIXBIG) {
|
if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) {
|
||||||
// If not specify -X option, get BitMode from enviorment variable
|
// If not specify -X option, get BitMode from enviorment variable
|
||||||
// "OBJECT_MODE" for AIX OS if specify.
|
// "OBJECT_MODE" for AIX OS if specify.
|
||||||
if (!HasAIXXOption) {
|
if (!HasAIXXOption) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user