diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2212,10 +2212,10 @@ Group; def mno_power9_vector : Flag<["-"], "mno-power9-vector">, Group; -def mpower8_crypto : Flag<["-"], "mcrypto">, - Group; -def mnopower8_crypto : Flag<["-"], "mno-crypto">, - Group; +def mcrypto : Flag<["-"], "mcrypto">, Group, + HelpText<"Add use of cryptographic instructions (ARM/PowerPC only)">; +def mnocrypto : Flag<["-"], "mno-crypto">, Group, + HelpText<"Disallow use of cryptographic instructions (ARM/PowerPC only)">; def mdirect_move : Flag<["-"], "mdirect-move">, Group; def mnodirect_move : Flag<["-"], "mno-direct-move">, diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -188,6 +188,16 @@ if (!success) D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); + // En/disable crypto + if (Arg *A = Args.getLastArg(options::OPT_mcrypto, options::OPT_mnocrypto, + options::OPT_mgeneral_regs_only)) { + if (A->getOption().matches(options::OPT_mcrypto)) + Features.push_back("+crypto"); + else + Features.push_back("-crypto"); + } + + if (Args.getLastArg(options::OPT_mgeneral_regs_only)) { Features.push_back("-fp-armv8"); Features.push_back("-crypto"); diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -422,6 +422,14 @@ Features.push_back("+fullfp16"); } + // En/disable crypto + if (Arg *A = Args.getLastArg(options::OPT_mcrypto, options::OPT_mnocrypto)) { + if (A->getOption().matches(options::OPT_mcrypto)) + Features.push_back("+crypto"); + else + Features.push_back("-crypto"); + } + // Setting -msoft-float/-mfloat-abi=soft effectively disables the FPU (GCC // ignores the -mfpu options in this case). // Note that the ABI can also be set implicitly by the target selected. diff --git a/clang/lib/Driver/ToolChains/Arch/PPC.h b/clang/lib/Driver/ToolChains/Arch/PPC.h --- a/clang/lib/Driver/ToolChains/Arch/PPC.h +++ b/clang/lib/Driver/ToolChains/Arch/PPC.h @@ -22,6 +22,8 @@ bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value); +bool hasCryptoFeatureEnabled(const llvm::opt::ArgList &Args); + enum class FloatABI { Invalid, Soft, diff --git a/clang/lib/Driver/ToolChains/Arch/PPC.cpp b/clang/lib/Driver/ToolChains/Arch/PPC.cpp --- a/clang/lib/Driver/ToolChains/Arch/PPC.cpp +++ b/clang/lib/Driver/ToolChains/Arch/PPC.cpp @@ -109,6 +109,9 @@ ppc::ReadGOTPtrMode ReadGOT = ppc::getPPCReadGOTPtrMode(D, Triple, Args); if (ReadGOT == ppc::ReadGOTPtrMode::SecurePlt) Features.push_back("+secure-plt"); + + if (ppc::hasCryptoFeatureEnabled(Args)) + Features.push_back("+crypto"); } ppc::ReadGOTPtrMode ppc::getPPCReadGOTPtrMode(const Driver &D, const llvm::Triple &Triple, @@ -154,3 +157,10 @@ Arg *A = Args.getLastArg(options::OPT_mabi_EQ); return A && (A->getValue() == StringRef(Value)); } + +bool ppc::hasCryptoFeatureEnabled(const ArgList &Args) { + if (Arg *A = Args.getLastArg(options::OPT_mcrypto, options::OPT_mnocrypto)) + if (A->getOption().matches(options::OPT_mcrypto)) + return true; + return false; +} diff --git a/clang/test/Driver/aarch64-crypto.c b/clang/test/Driver/aarch64-crypto.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/aarch64-crypto.c @@ -0,0 +1,8 @@ +// REQUIRES: aarch64-registered-target +// RUN: %clang -target aarch64 -mcrypto -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-AARCH64-CRYPTO < %t %s +// CHECK-AARCH64-CRYPTO: "-target-feature" "+crypto" + +// RUN: %clang -target aarch64 -mno-crypto -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-AARCH64-NOCRYPTO < %t %s +// CHECK-AARCH64-NOCRYPTO: "-target-feature" "-crypto" diff --git a/clang/test/Driver/armv8-crypto.c b/clang/test/Driver/armv8-crypto.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/armv8-crypto.c @@ -0,0 +1,8 @@ +// REQUIRES: arm-registered-target +// RUN: %clang -target armv8 -mcrypto -mhard-float -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-V8-CRYPTO < %t %s +// CHECK-V8-CRYPTO: "-target-feature" "+crypto" + +// RUN: %clang -target armv8 -mno-crypto -mhard-float -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-V8-NOCRYPTO < %t %s +// CHECK-V8-NOCRYPTO: "-target-feature" "-crypto" diff --git a/lld/ELF/CallGraphSort.cpp b/lld/ELF/CallGraphSort.cpp --- a/lld/ELF/CallGraphSort.cpp +++ b/lld/ELF/CallGraphSort.cpp @@ -226,6 +226,26 @@ for (int SecIndex : C.Sections) OrderMap[Sections[SecIndex]] = CurOrder++; + if (!Config->PrintSymbolOrder.empty()) { + std::error_code EC; + raw_fd_ostream OS(Config->PrintSymbolOrder, EC, sys::fs::F_None); + if (EC) { + error("cannot open " + Config->PrintSymbolOrder + ": " + EC.message()); + return OrderMap; + } + + // Print the symbols ordered by C3, in the order of increasing CurOrder + // Instead of sorting all the OrderMap, just repeat the loops above. + for (const Cluster &C : Clusters) + for (int SecIndex : C.Sections) + // Search all the symbols in the file of the section + // and find out a Defined symbol with name that is within the section. + for (Symbol *Sym: Sections[SecIndex]->File->getSymbols()) + if (!Sym->isSection()) // Filter out section-type symbols here. + if (auto *D = dyn_cast(Sym)) + if (Sections[SecIndex] == D->Section) + OS << Sym->getName() << "\n"; + } return OrderMap; } diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -101,6 +101,7 @@ llvm::StringRef OptRemarksFilename; llvm::StringRef OptRemarksPasses; llvm::StringRef ProgName; + llvm::StringRef PrintSymbolOrder; llvm::StringRef SoName; llvm::StringRef Sysroot; llvm::StringRef ThinLTOCacheDir; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -828,6 +828,8 @@ Args.hasFlag(OPT_print_icf_sections, OPT_no_print_icf_sections, false); Config->PrintGcSections = Args.hasFlag(OPT_print_gc_sections, OPT_no_print_gc_sections, false); + Config->PrintSymbolOrder = + Args.getLastArgValue(OPT_print_symbol_order); Config->Rpath = getRpath(Args); Config->Relocatable = Args.hasArg(OPT_relocatable); Config->SaveTemps = Args.hasArg(OPT_save_temps); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -274,6 +274,10 @@ "List identical folded sections", "Do not list identical folded sections (default)">; +defm print_symbol_order: + Eq<"print-symbol-order", + "Print a symbol order specified by --call-graph-ordering-file into the speficied file">; + def pop_state: F<"pop-state">, HelpText<"Undo the effect of -push-state">; diff --git a/lld/test/ELF/cgprofile-print.s b/lld/test/ELF/cgprofile-print.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/cgprofile-print.s @@ -0,0 +1,37 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: echo "A B 5" > %t.call_graph +# RUN: echo "B C 50" >> %t.call_graph +# RUN: echo "C D 40" >> %t.call_graph +# RUN: echo "D B 10" >> %t.call_graph +# RUN: ld.lld -e A %t --call-graph-ordering-file %t.call_graph -o %t2 --print-symbol-order=%t3 +# RUN: FileCheck %s --input-file %t3 + +# CHECK: B +# CHECK-NEXT: C +# CHECK-NEXT: D +# CHECK-NEXT: A + +.section .text.A,"ax",@progbits +.globl A +A: + nop + +.section .text.B,"ax",@progbits +.globl B +B: + nop + +.section .text.C,"ax",@progbits +.globl C +C: + nop + +.section .text.D,"ax",@progbits +.globl D +D: + nop + + + diff --git a/lld/test/ELF/cgprofile-reproduce.s b/lld/test/ELF/cgprofile-reproduce.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/cgprofile-reproduce.s @@ -0,0 +1,42 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: echo "A B 5" > %t.call_graph +# RUN: echo "B C 50" >> %t.call_graph +# RUN: echo "C D 40" >> %t.call_graph +# RUN: echo "D B 10" >> %t.call_graph +# RUN: ld.lld -e A %t --call-graph-ordering-file %t.call_graph -o %t2 --print-symbol-order=%t3 +# RUN: ld.lld -e A %t --symbol-ordering-file %t3 -o %t2 +# RUN: llvm-readobj -symbols %t2 | FileCheck %s + +# CHECK: Name: A +# CHECK-NEXT: Value: 0x201003 +# CHECK: Name: B +# CHECK-NEXT: Value: 0x201000 +# CHECK: Name: C +# CHECK-NEXT: Value: 0x201001 +# CHECK: Name: D +# CHECK-NEXT: Value: 0x201002 + +.section .text.A,"ax",@progbits +.globl A +A: + nop + +.section .text.B,"ax",@progbits +.globl B +B: + nop + +.section .text.C,"ax",@progbits +.globl C +C: + nop + +.section .text.D,"ax",@progbits +.globl D +D: + nop + + +