[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
This revision was automatically updated to reflect the committed changes. Closed by commit rL313018: [ARM] Option for reading thread pointer from coprocessor register (authored by spetrovic). Changed prior to commit: https://reviews.llvm.org/D34878?vs=114618=114792#toc Repository: rL LLVM https://reviews.llvm.org/D34878 Files: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td cfe/trunk/include/clang/Driver/CC1Options.td cfe/trunk/include/clang/Driver/Options.td cfe/trunk/lib/Driver/ToolChains/Arch/ARM.cpp cfe/trunk/lib/Driver/ToolChains/Arch/ARM.h cfe/trunk/test/Driver/clang-translation.c Index: cfe/trunk/lib/Driver/ToolChains/Arch/ARM.h === --- cfe/trunk/lib/Driver/ToolChains/Arch/ARM.h +++ cfe/trunk/lib/Driver/ToolChains/Arch/ARM.h @@ -32,14 +32,21 @@ void appendEBLinkFlags(const llvm::opt::ArgList , llvm::opt::ArgStringList , const llvm::Triple ); +enum class ReadTPMode { + Invalid, + Soft, + Cp15, +}; + enum class FloatABI { Invalid, Soft, SoftFP, Hard, }; FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); +ReadTPMode getReadTPMode(const ToolChain , const llvm::opt::ArgList ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: cfe/trunk/lib/Driver/ToolChains/Arch/ARM.cpp === --- cfe/trunk/lib/Driver/ToolChains/Arch/ARM.cpp +++ cfe/trunk/lib/Driver/ToolChains/Arch/ARM.cpp @@ -131,6 +131,26 @@ T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); } +// Select mode for reading thread pointer (-mtp=soft/cp15). +arm::ReadTPMode arm::getReadTPMode(const ToolChain , const ArgList ) { + if (Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) { +const Driver = TC.getDriver(); +arm::ReadTPMode ThreadPointer = +llvm::StringSwitch(A->getValue()) +.Case("cp15", ReadTPMode::Cp15) +.Case("soft", ReadTPMode::Soft) +.Default(ReadTPMode::Invalid); +if (ThreadPointer != ReadTPMode::Invalid) + return ThreadPointer; +if (StringRef(A->getValue()).empty()) + D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); +else + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); +return ReadTPMode::Invalid; + } + return ReadTPMode::Soft; +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. arm::FloatABI arm::getARMFloatABI(const ToolChain , const ArgList ) { @@ -262,6 +282,7 @@ bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -303,6 +324,9 @@ } } + if (ThreadPointer == arm::ReadTPMode::Cp15) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: cfe/trunk/include/clang/Driver/Options.td === --- cfe/trunk/include/clang/Driver/Options.td +++ cfe/trunk/include/clang/Driver/Options.td @@ -1689,6 +1689,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"], "mno-execute-only">, Group, HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility def mno_pure_code : Flag<["-"], "mno-pure-code">, Alias; def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group; Index: cfe/trunk/include/clang/Driver/CC1Options.td === --- cfe/trunk/include/clang/Driver/CC1Options.td +++ cfe/trunk/include/clang/Driver/CC1Options.td @@ -257,6 +257,8 @@ "precision">; def mfloat_abi : Separate<["-"], "mfloat-abi">, HelpText<"The float ABI to use">; +def mtp : Separate<["-"], "mtp">, + HelpText<"Mode for reading thread pointer">; def mlimit_float_precision : Separate<["-"], "mlimit-float-precision">, HelpText<"Limit float precision to the given value">; def split_stacks : Flag<["-"], "split-stacks">, Index: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td === --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td @@ -101,6 +101,10 @@ "failing because %select{environment variable
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
kristof.beyls added a comment. Still LGTM; please commit. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic updated this revision to Diff 114618. spetrovic added a comment. Indentations fixed. https://reviews.llvm.org/D34878 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/CC1Options.td include/clang/Driver/Options.td lib/Driver/ToolChains/Arch/ARM.cpp lib/Driver/ToolChains/Arch/ARM.h test/Driver/clang-translation.c Index: test/Driver/clang-translation.c === --- test/Driver/clang-translation.c +++ test/Driver/clang-translation.c @@ -87,6 +87,18 @@ // ARMV5E: "-cc1" // ARMV5E: "-target-cpu" "arm1022e" +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER-HARD %s +// ARMv7_THREAD_POINTER-HARD: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -mtp=soft -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_SOFT %s +// ARMv7_THREAD_POINTER_SOFT-NOT: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_NON %s +// ARMv7_THREAD_POINTER_NON-NOT: "-target-feature" "+read-tp-hard" + // RUN: %clang -target powerpc64-unknown-linux-gnu \ // RUN: -### -S %s -mcpu=G5 2>&1 | FileCheck -check-prefix=PPCG5 %s // PPCG5: clang Index: lib/Driver/ToolChains/Arch/ARM.h === --- lib/Driver/ToolChains/Arch/ARM.h +++ lib/Driver/ToolChains/Arch/ARM.h @@ -32,14 +32,21 @@ void appendEBLinkFlags(const llvm::opt::ArgList , llvm::opt::ArgStringList , const llvm::Triple ); +enum class ReadTPMode { + Invalid, + Soft, + Cp15, +}; + enum class FloatABI { Invalid, Soft, SoftFP, Hard, }; FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); +ReadTPMode getReadTPMode(const ToolChain , const llvm::opt::ArgList ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -131,6 +131,26 @@ T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); } +// Select mode for reading thread pointer (-mtp=soft/cp15). +arm::ReadTPMode arm::getReadTPMode(const ToolChain , const ArgList ) { + if (Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) { +const Driver = TC.getDriver(); +arm::ReadTPMode ThreadPointer = +llvm::StringSwitch(A->getValue()) +.Case("cp15", ReadTPMode::Cp15) +.Case("soft", ReadTPMode::Soft) +.Default(ReadTPMode::Invalid); +if (ThreadPointer != ReadTPMode::Invalid) + return ThreadPointer; +if (StringRef(A->getValue()).empty()) + D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); +else + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); +return ReadTPMode::Invalid; + } + return ReadTPMode::Soft; +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. arm::FloatABI arm::getARMFloatABI(const ToolChain , const ArgList ) { @@ -262,6 +282,7 @@ bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -303,6 +324,9 @@ } } + if (ThreadPointer == arm::ReadTPMode::Cp15) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: include/clang/Driver/Options.td === --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1689,6 +1689,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"], "mno-execute-only">, Group, HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility def mno_pure_code : Flag<["-"], "mno-pure-code">, Alias; def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group; Index: include/clang/Driver/CC1Options.td === --- include/clang/Driver/CC1Options.td +++ include/clang/Driver/CC1Options.td @@ -257,6 +257,8 @@ "precision">; def mfloat_abi : Separate<["-"], "mfloat-abi">,
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added a comment. Thanks for the review! I will check indentations with clang format. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
kristof.beyls accepted this revision. kristof.beyls added a comment. This revision is now accepted and ready to land. Thanks Strahinja! I thought that some indentations looked a bit strange, so I'd just still check that clang-format formats your changes the same way. Otherwise LGTM! https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic updated this revision to Diff 114582. https://reviews.llvm.org/D34878 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/CC1Options.td include/clang/Driver/Options.td lib/Driver/ToolChains/Arch/ARM.cpp lib/Driver/ToolChains/Arch/ARM.h test/Driver/clang-translation.c Index: test/Driver/clang-translation.c === --- test/Driver/clang-translation.c +++ test/Driver/clang-translation.c @@ -87,6 +87,18 @@ // ARMV5E: "-cc1" // ARMV5E: "-target-cpu" "arm1022e" +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER-HARD %s +// ARMv7_THREAD_POINTER-HARD: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -mtp=soft -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_SOFT %s +// ARMv7_THREAD_POINTER_SOFT-NOT: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_NON %s +// ARMv7_THREAD_POINTER_NON-NOT: "-target-feature" "+read-tp-hard" + // RUN: %clang -target powerpc64-unknown-linux-gnu \ // RUN: -### -S %s -mcpu=G5 2>&1 | FileCheck -check-prefix=PPCG5 %s // PPCG5: clang Index: lib/Driver/ToolChains/Arch/ARM.h === --- lib/Driver/ToolChains/Arch/ARM.h +++ lib/Driver/ToolChains/Arch/ARM.h @@ -32,14 +32,21 @@ void appendEBLinkFlags(const llvm::opt::ArgList , llvm::opt::ArgStringList , const llvm::Triple ); +enum class ReadTPMode { + Invalid, + Soft, + Cp15, +}; + enum class FloatABI { Invalid, Soft, SoftFP, Hard, }; FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); +ReadTPMode getReadTPMode(const ToolChain , const llvm::opt::ArgList ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -131,6 +131,27 @@ T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); } +// Select mode for reading thread pointer (-mtp=soft/cp15). +arm::ReadTPMode arm::getReadTPMode(const ToolChain , const ArgList ) { + if (Arg *A = + Args.getLastArg(options::OPT_mtp_mode_EQ)) { +const Driver = TC.getDriver(); +arm::ReadTPMode ThreadPointer = + llvm::StringSwitch(A->getValue()) + .Case("cp15", ReadTPMode::Cp15) + .Case("soft", ReadTPMode::Soft) + .Default(ReadTPMode::Invalid); +if (ThreadPointer != ReadTPMode::Invalid) + return ThreadPointer; +if (StringRef(A->getValue()).empty()) + D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); +else + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); +return ReadTPMode::Invalid; + } + return ReadTPMode::Soft; +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. arm::FloatABI arm::getARMFloatABI(const ToolChain , const ArgList ) { @@ -262,6 +283,7 @@ bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -303,6 +325,10 @@ } } + + if (ThreadPointer == arm::ReadTPMode::Cp15) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: include/clang/Driver/Options.td === --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1689,6 +1689,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"], "mno-execute-only">, Group, HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility def mno_pure_code : Flag<["-"], "mno-pure-code">, Alias; def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group; Index: include/clang/Driver/CC1Options.td === --- include/clang/Driver/CC1Options.td +++ include/clang/Driver/CC1Options.td @@ -257,6 +257,8 @@ "precision">; def mfloat_abi : Separate<["-"], "mfloat-abi">,
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added inline comments. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:149-150 +else + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); + } + return ReadTPMode::Soft; kristof.beyls wrote: > a return ReadTPMode::Invalid is missing here. Yes, my mistake, I will fix that. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
kristof.beyls added inline comments. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:137 + const Driver = TC.getDriver(); + arm::ReadTPMode ThreadPointer = ReadTPMode::Invalid; + if (Arg *A = With the new version of the code, there's no need to have a ThreadPointer variable declared here; it can be declared inside the if statement below instead. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:149-150 +else + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); + } + return ReadTPMode::Soft; a return ReadTPMode::Invalid is missing here. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added a comment. Comments addressed. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic updated this revision to Diff 114573. https://reviews.llvm.org/D34878 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/CC1Options.td include/clang/Driver/Options.td lib/Driver/ToolChains/Arch/ARM.cpp lib/Driver/ToolChains/Arch/ARM.h test/Driver/clang-translation.c Index: test/Driver/clang-translation.c === --- test/Driver/clang-translation.c +++ test/Driver/clang-translation.c @@ -87,6 +87,18 @@ // ARMV5E: "-cc1" // ARMV5E: "-target-cpu" "arm1022e" +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER-HARD %s +// ARMv7_THREAD_POINTER-HARD: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -mtp=soft -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_SOFT %s +// ARMv7_THREAD_POINTER_SOFT-NOT: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_NON %s +// ARMv7_THREAD_POINTER_NON-NOT: "-target-feature" "+read-tp-hard" + // RUN: %clang -target powerpc64-unknown-linux-gnu \ // RUN: -### -S %s -mcpu=G5 2>&1 | FileCheck -check-prefix=PPCG5 %s // PPCG5: clang Index: lib/Driver/ToolChains/Arch/ARM.h === --- lib/Driver/ToolChains/Arch/ARM.h +++ lib/Driver/ToolChains/Arch/ARM.h @@ -32,14 +32,21 @@ void appendEBLinkFlags(const llvm::opt::ArgList , llvm::opt::ArgStringList , const llvm::Triple ); +enum class ReadTPMode { + Invalid, + Soft, + Cp15, +}; + enum class FloatABI { Invalid, Soft, SoftFP, Hard, }; FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); +ReadTPMode getReadTPMode(const ToolChain , const llvm::opt::ArgList ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -131,6 +131,26 @@ T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); } +// Select mode for reading thread pointer (-mtp=soft/cp15). +arm::ReadTPMode arm::getReadTPMode(const ToolChain , const ArgList ) { + const Driver = TC.getDriver(); + arm::ReadTPMode ThreadPointer = ReadTPMode::Invalid; + if (Arg *A = + Args.getLastArg(options::OPT_mtp_mode_EQ)) { +ThreadPointer = llvm::StringSwitch(A->getValue()) +.Case("cp15", ReadTPMode::Cp15) +.Case("soft", ReadTPMode::Soft) +.Default(ReadTPMode::Invalid); +if (ThreadPointer != ReadTPMode::Invalid) + return ThreadPointer; +if (StringRef(A->getValue()).empty()) + D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); +else + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); + } + return ReadTPMode::Soft; +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. arm::FloatABI arm::getARMFloatABI(const ToolChain , const ArgList ) { @@ -262,6 +282,7 @@ bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -303,6 +324,10 @@ } } + + if (ThreadPointer == arm::ReadTPMode::Cp15) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: include/clang/Driver/Options.td === --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1689,6 +1689,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"], "mno-execute-only">, Group, HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility def mno_pure_code : Flag<["-"], "mno-pure-code">, Alias; def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group; Index: include/clang/Driver/CC1Options.td === --- include/clang/Driver/CC1Options.td +++ include/clang/Driver/CC1Options.td @@ -257,6 +257,8 @@ "precision">; def mfloat_abi : Separate<["-"], "mfloat-abi">,
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
kristof.beyls added inline comments. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:145-146 + // choose soft mode. + if (ThreadPointer == ReadTPMode::Invalid) +ThreadPointer = ReadTPMode::Soft; + return ThreadPointer; spetrovic wrote: > kristof.beyls wrote: > > and always give an error if an invalid mtp command line option was > > given, rather than default back to soft mode? > If 'mtp' takes invalid value, error is always provided. This is the case when > there is no -mtp option in command line, you can see how the case of invalid > mtp argument is handled in the code above. Right. I just thought that the function would be ever so slightly simpler if it had the following structure roughly: ``` if (Arg *A = ...) { ThreadPointer = llvm::StringSwitch... ; if (!Invalid) return ThreadPointer; if (empty) D.Diag(); else D.Diag(); return Invalid; } return ReadTPMode::Soft; ``` And probably is also slightly closer to the coding standard described in https://llvm.org/docs/CodingStandards.html#use-early-exits-and-continue-to-simplify-code But this is a really minor comment. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic updated this revision to Diff 114329. spetrovic marked 3 inline comments as done. https://reviews.llvm.org/D34878 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/CC1Options.td include/clang/Driver/Options.td lib/Driver/ToolChains/Arch/ARM.cpp lib/Driver/ToolChains/Arch/ARM.h test/Driver/clang-translation.c Index: test/Driver/clang-translation.c === --- test/Driver/clang-translation.c +++ test/Driver/clang-translation.c @@ -87,6 +87,18 @@ // ARMV5E: "-cc1" // ARMV5E: "-target-cpu" "arm1022e" +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER-HARD %s +// ARMv7_THREAD_POINTER-HARD: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -mtp=soft -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_SOFT %s +// ARMv7_THREAD_POINTER_SOFT-NOT: "-target-feature" "+read-tp-hard" + +// RUN: %clang -target arm-linux -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_NON %s +// ARMv7_THREAD_POINTER_NON-NOT: "-target-feature" "+read-tp-hard" + // RUN: %clang -target powerpc64-unknown-linux-gnu \ // RUN: -### -S %s -mcpu=G5 2>&1 | FileCheck -check-prefix=PPCG5 %s // PPCG5: clang Index: lib/Driver/ToolChains/Arch/ARM.h === --- lib/Driver/ToolChains/Arch/ARM.h +++ lib/Driver/ToolChains/Arch/ARM.h @@ -32,14 +32,21 @@ void appendEBLinkFlags(const llvm::opt::ArgList , llvm::opt::ArgStringList , const llvm::Triple ); +enum class ReadTPMode { + Invalid, + Soft, + Cp15, +}; + enum class FloatABI { Invalid, Soft, SoftFP, Hard, }; FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); +ReadTPMode getReadTPMode(const ToolChain , const llvm::opt::ArgList ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -131,6 +131,31 @@ T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); } +// Select mode for reading thread pointer (-mtp=soft/cp15). +arm::ReadTPMode arm::getReadTPMode(const ToolChain , const ArgList ) { + const Driver = TC.getDriver(); + arm::ReadTPMode ThreadPointer = ReadTPMode::Invalid; + if (Arg *A = + Args.getLastArg(options::OPT_mtp_mode_EQ)) { +ThreadPointer = llvm::StringSwitch(A->getValue()) +.Case("cp15", ReadTPMode::Cp15) +.Case("soft", ReadTPMode::Soft) +.Default(ReadTPMode::Invalid); +if (ThreadPointer == ReadTPMode::Invalid) { + if (StringRef(A->getValue()).empty()) +D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); + else +D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); +} + } + + // If -mtp option not specified or takes invalid/empty argument + // choose soft mode. + if (ThreadPointer == ReadTPMode::Invalid) +ThreadPointer = ReadTPMode::Soft; + return ThreadPointer; +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. arm::FloatABI arm::getARMFloatABI(const ToolChain , const ArgList ) { @@ -262,6 +287,7 @@ bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -303,6 +329,10 @@ } } + + if (ThreadPointer == arm::ReadTPMode::Cp15) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: include/clang/Driver/Options.td === --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1689,6 +1689,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"], "mno-execute-only">, Group, HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility def mno_pure_code : Flag<["-"], "mno-pure-code">, Alias; def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group; Index: include/clang/Driver/CC1Options.td
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic marked 3 inline comments as done. spetrovic added inline comments. Comment at: include/clang/Driver/Options.td:1664-1665 HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility kristof.beyls wrote: > Looking at the gcc documentation for this option > (https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html), gcc accepts 3 values: > 'soft', 'cp15' and 'auto', with the default setting being 'auto'. > This patch implements just 2 of those values: 'soft' and 'cp15'. > I think this is fine, as long as the default value is 'soft'. > The 'auto' value should automatically pick 'cp15' if that's going to work on > what you're targeting. If I understood correctly, that depends both on the > architecture version you're targeting and the operating system/kernel you're > targeting. So, there could be a lot of details to go through to get 'auto' > right in all cases. Which is why I think it's fine to leave an implementation > of 'auto' for later. > Is the default value 'soft'? I agree with your opinion about 'auto'. If -mtp option is not specified, yes, default value is soft. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:128 + const Driver = TC.getDriver(); + arm::ReadTPMode ThreadPointer = ReadTPMode::Invalid; + if (Arg *A = kristof.beyls wrote: > Wouldn't it be better to default to ReadTPMode::Soft when not -mtp command > line option is given? When there is no -mtp in command line ReadTPMode::Soft is default value, ReadTPMode::Invalid is in case when someone try to put in -mtp value that is not cp15 or soft (e.g. -mtp=x). Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:145-146 + // choose soft mode. + if (ThreadPointer == ReadTPMode::Invalid) +ThreadPointer = ReadTPMode::Soft; + return ThreadPointer; kristof.beyls wrote: > and always give an error if an invalid mtp command line option was > given, rather than default back to soft mode? If 'mtp' takes invalid value, error is always provided. This is the case when there is no -mtp option in command line, you can see how the case of invalid mtp argument is handled in the code above. Comment at: lib/Driver/ToolChains/Clang.cpp:1348-1358 + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(getToolChain(), Args); + if (ThreadPointer == arm::ReadTPMode::Cp15) { +CmdArgs.push_back("-mtp"); +CmdArgs.push_back("cp15"); + } else { +assert(ThreadPointer == arm::ReadTPMode::Soft && + "Invalid mode for reading thread pointer"); kristof.beyls wrote: > My inexperience in this part of the code base is probably showing, but why is > this needed at all? > IIUC, in D34408, you modelled TPMode in the backend using a target feature, > and there isn't a custom -mtp option there? > Maybe this is left-over code from an earlier revision of D34408, that's no > longer needed? Well, actually you are right, we can remove this part of the code, I was thinking that maybe someone in future will need in backend that '-mtp' option also can be recgonized, so I added this, but you are right, I will remove this. Comment at: test/Driver/clang-translation.c:78-82 +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER %s +// ARMv7_THREAD_POINTER: "-target-feature" "+read-tp-hard" +// ARMv7_THREAD_POINTER: "-mtp" "cp15" +// ARMv7_THREAD_POINTER-NOT: "mtp" "soft" kristof.beyls wrote: > It probably would be good to also have a test that when no mtp option is > given, the equivalent of when '-mtp soft' is specified would happen. > Furthermore, my inexperience in this part of the code base probably shows, > but I'm puzzled as to why this test is looking for '-mtp' in the output. > Wouldn't the '-target-feature +read-tp-hard' be enough to convey the > information to the mid- and back-end? Checks for '-mtp' in the output are unnecessary when we remove part of the code that you mentioned in previous comment. Repository: rL LLVM https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
kristof.beyls added inline comments. Comment at: include/clang/Driver/Options.td:1664-1665 HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility Looking at the gcc documentation for this option (https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html), gcc accepts 3 values: 'soft', 'cp15' and 'auto', with the default setting being 'auto'. This patch implements just 2 of those values: 'soft' and 'cp15'. I think this is fine, as long as the default value is 'soft'. The 'auto' value should automatically pick 'cp15' if that's going to work on what you're targeting. If I understood correctly, that depends both on the architecture version you're targeting and the operating system/kernel you're targeting. So, there could be a lot of details to go through to get 'auto' right in all cases. Which is why I think it's fine to leave an implementation of 'auto' for later. Is the default value 'soft'? Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:128 + const Driver = TC.getDriver(); + arm::ReadTPMode ThreadPointer = ReadTPMode::Invalid; + if (Arg *A = Wouldn't it be better to default to ReadTPMode::Soft when not -mtp command line option is given? Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:145-146 + // choose soft mode. + if (ThreadPointer == ReadTPMode::Invalid) +ThreadPointer = ReadTPMode::Soft; + return ThreadPointer; and always give an error if an invalid mtp command line option was given, rather than default back to soft mode? Comment at: lib/Driver/ToolChains/Clang.cpp:1348-1358 + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(getToolChain(), Args); + if (ThreadPointer == arm::ReadTPMode::Cp15) { +CmdArgs.push_back("-mtp"); +CmdArgs.push_back("cp15"); + } else { +assert(ThreadPointer == arm::ReadTPMode::Soft && + "Invalid mode for reading thread pointer"); My inexperience in this part of the code base is probably showing, but why is this needed at all? IIUC, in D34408, you modelled TPMode in the backend using a target feature, and there isn't a custom -mtp option there? Maybe this is left-over code from an earlier revision of D34408, that's no longer needed? Comment at: test/Driver/clang-translation.c:78-82 +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER %s +// ARMv7_THREAD_POINTER: "-target-feature" "+read-tp-hard" +// ARMv7_THREAD_POINTER: "-mtp" "cp15" +// ARMv7_THREAD_POINTER-NOT: "mtp" "soft" It probably would be good to also have a test that when no mtp option is given, the equivalent of when '-mtp soft' is specified would happen. Furthermore, my inexperience in this part of the code base probably shows, but I'm puzzled as to why this test is looking for '-mtp' in the output. Wouldn't the '-target-feature +read-tp-hard' be enough to convey the information to the mid- and back-end? Repository: rL LLVM https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added a comment. ping Repository: rL LLVM https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added inline comments. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:136 +if (ThreadPointer == ReadTPMode::Invalid && +!StringRef(A->getValue()).empty()) { + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); bruno wrote: > What happens if you pass an empty "-mtp=" to the driver? Will it silently > assume soft? Shouldn't it be an error too? I agree, it should be an error, I fixed that. Repository: rL LLVM https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic updated this revision to Diff 109571. spetrovic marked 2 inline comments as done. Repository: rL LLVM https://reviews.llvm.org/D34878 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/CC1Options.td include/clang/Driver/Options.td lib/Driver/ToolChains/Arch/ARM.cpp lib/Driver/ToolChains/Arch/ARM.h lib/Driver/ToolChains/Clang.cpp test/Driver/clang-translation.c Index: test/Driver/clang-translation.c === --- test/Driver/clang-translation.c +++ test/Driver/clang-translation.c @@ -75,6 +75,12 @@ // ARMV5E: "-cc1" // ARMV5E: "-target-cpu" "arm1022e" +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER %s +// ARMv7_THREAD_POINTER: "-target-feature" "+read-tp-hard" +// ARMv7_THREAD_POINTER: "-mtp" "cp15" +// ARMv7_THREAD_POINTER-NOT: "mtp" "soft" + // RUN: %clang -target powerpc64-unknown-linux-gnu \ // RUN: -### -S %s -mcpu=G5 2>&1 | FileCheck -check-prefix=PPCG5 %s // PPCG5: clang Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -1345,6 +1345,17 @@ CmdArgs.push_back("hard"); } + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(getToolChain(), Args); + if (ThreadPointer == arm::ReadTPMode::Cp15) { +CmdArgs.push_back("-mtp"); +CmdArgs.push_back("cp15"); + } else { +assert(ThreadPointer == arm::ReadTPMode::Soft && + "Invalid mode for reading thread pointer"); +CmdArgs.push_back("-mtp"); +CmdArgs.push_back("soft"); + } + // Forward the -mglobal-merge option for explicit control over the pass. if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, options::OPT_mno_global_merge)) { Index: lib/Driver/ToolChains/Arch/ARM.h === --- lib/Driver/ToolChains/Arch/ARM.h +++ lib/Driver/ToolChains/Arch/ARM.h @@ -32,14 +32,21 @@ void appendEBLinkFlags(const llvm::opt::ArgList , llvm::opt::ArgStringList , const llvm::Triple ); +enum class ReadTPMode { + Invalid, + Soft, + Cp15, +}; + enum class FloatABI { Invalid, Soft, SoftFP, Hard, }; FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); +ReadTPMode getReadTPMode(const ToolChain , const llvm::opt::ArgList ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -122,6 +122,31 @@ T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); } +// Select mode for reading thread pointer (-mtp=soft/cp15). +arm::ReadTPMode arm::getReadTPMode(const ToolChain , const ArgList ) { + const Driver = TC.getDriver(); + arm::ReadTPMode ThreadPointer = ReadTPMode::Invalid; + if (Arg *A = + Args.getLastArg(options::OPT_mtp_mode_EQ)) { +ThreadPointer = llvm::StringSwitch(A->getValue()) +.Case("cp15", ReadTPMode::Cp15) +.Case("soft", ReadTPMode::Soft) +.Default(ReadTPMode::Invalid); +if (ThreadPointer == ReadTPMode::Invalid) { + if (StringRef(A->getValue()).empty()) +D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); + else +D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); +} + } + + // If -mtp option not specified or takes invalid/empty argument + // choose soft mode. + if (ThreadPointer == ReadTPMode::Invalid) +ThreadPointer = ReadTPMode::Soft; + return ThreadPointer; +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. arm::FloatABI arm::getARMFloatABI(const ToolChain , const ArgList ) { @@ -253,6 +278,7 @@ bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -294,6 +320,10 @@ } } + + if (ThreadPointer == arm::ReadTPMode::Cp15) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: include/clang/Driver/Options.td === --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1661,6 +1661,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"],
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
bruno added inline comments. Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:136 +if (ThreadPointer == ReadTPMode::Invalid && +!StringRef(A->getValue()).empty()) { + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); What happens if you pass an empty "-mtp=" to the driver? Will it silently assume soft? Shouldn't it be an error too? Comment at: lib/Driver/ToolChains/Arch/ARM.cpp:138 + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); + ThreadPointer = ReadTPMode::Soft; +} Won't this assignment be covered by the code below anyway? Maybe remove it? https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added a comment. Comments addressed. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic updated this revision to Diff 109088. https://reviews.llvm.org/D34878 Files: include/clang/Basic/DiagnosticDriverKinds.td include/clang/Driver/CC1Options.td include/clang/Driver/Options.td lib/Driver/ToolChains/Arch/ARM.cpp lib/Driver/ToolChains/Arch/ARM.h lib/Driver/ToolChains/Clang.cpp test/Driver/clang-translation.c Index: test/Driver/clang-translation.c === --- test/Driver/clang-translation.c +++ test/Driver/clang-translation.c @@ -75,6 +75,12 @@ // ARMV5E: "-cc1" // ARMV5E: "-target-cpu" "arm1022e" +// RUN: %clang -target arm-linux -mtp=cp15 -### -S %s -arch armv7 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER %s +// ARMv7_THREAD_POINTER: "-target-feature" "+read-tp-hard" +// ARMv7_THREAD_POINTER: "-mtp" "cp15" +// ARMv7_THREAD_POINTER-NOT: "mtp" "soft" + // RUN: %clang -target powerpc64-unknown-linux-gnu \ // RUN: -### -S %s -mcpu=G5 2>&1 | FileCheck -check-prefix=PPCG5 %s // PPCG5: clang Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -1345,6 +1345,17 @@ CmdArgs.push_back("hard"); } + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(getToolChain(), Args); + if (ThreadPointer == arm::ReadTPMode::Cp15) { +CmdArgs.push_back("-mtp"); +CmdArgs.push_back("cp15"); + } else { +assert(ThreadPointer == arm::ReadTPMode::Soft && + "Invalid mode for reading thread pointer"); +CmdArgs.push_back("-mtp"); +CmdArgs.push_back("soft"); + } + // Forward the -mglobal-merge option for explicit control over the pass. if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, options::OPT_mno_global_merge)) { Index: lib/Driver/ToolChains/Arch/ARM.h === --- lib/Driver/ToolChains/Arch/ARM.h +++ lib/Driver/ToolChains/Arch/ARM.h @@ -32,14 +32,21 @@ void appendEBLinkFlags(const llvm::opt::ArgList , llvm::opt::ArgStringList , const llvm::Triple ); +enum class ReadTPMode { + Invalid, + Soft, + Cp15, +}; + enum class FloatABI { Invalid, Soft, SoftFP, Hard, }; FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); +ReadTPMode getReadTPMode(const ToolChain , const llvm::opt::ArgList ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -122,6 +122,27 @@ T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); } +// Select mode for reading thread pointer (-mtp=soft/cp15). +arm::ReadTPMode arm::getReadTPMode(const ToolChain , const ArgList ) { + const Driver = TC.getDriver(); + arm::ReadTPMode ThreadPointer = ReadTPMode::Invalid; + if (Arg *A = + Args.getLastArg(options::OPT_mtp_mode_EQ)) { +ThreadPointer = llvm::StringSwitch(A->getValue()) +.Case("cp15", ReadTPMode::Cp15) +.Case("soft", ReadTPMode::Soft) +.Default(ReadTPMode::Invalid); +if (ThreadPointer == ReadTPMode::Invalid && +!StringRef(A->getValue()).empty()) { + D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); + ThreadPointer = ReadTPMode::Soft; +} + } + if (ThreadPointer == ReadTPMode::Invalid) +ThreadPointer = ReadTPMode::Soft; + return ThreadPointer; +} + // Select the float ABI as determined by -msoft-float, -mhard-float, and // -mfloat-abi=. arm::FloatABI arm::getARMFloatABI(const ToolChain , const ArgList ) { @@ -253,6 +274,7 @@ bool KernelOrKext = Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); + arm::ReadTPMode ThreadPointer = arm::getReadTPMode(TC, Args); const Arg *WaCPU = nullptr, *WaFPU = nullptr; const Arg *WaHDiv = nullptr, *WaArch = nullptr; @@ -294,6 +316,10 @@ } } + + if (ThreadPointer == arm::ReadTPMode::Cp15) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: include/clang/Driver/Options.td === --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1661,6 +1661,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"], "mno-execute-only">, Group, HelpText<"Allow generation of data access to code sections (ARM only)">; +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group, Values<"soft, cp15">, + HelpText<"Read thread
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
bruno added a comment. If there's a precedence for a flag name there, it's nice to be compatible here. You don't necessarily need to use the same name as the backend. https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added a comment. Hi Bruno, Yes, GCC has similar option (-mtp=soft/hard), but name is not same. I put the same option name as in backend (https://reviews.llvm.org/D34408). https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
bruno added a comment. Hi Strahinja, Does GCC already has a similar option? If so, does this share the same name? https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added a comment. ping https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic added a comment. ping https://reviews.llvm.org/D34878 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34878: [ARM] Option for reading thread pointer from coprocessor register
spetrovic created this revision. Herald added subscribers: kristof.beyls, javed.absar, aemerson. This patch enables option for reading thread pointer directly from coprocessor register (-mread-tp-hard). This option is supported in llc also ( https://reviews.llvm.org/D34408 ). https://reviews.llvm.org/D34878 Files: include/clang/Driver/Options.td lib/Basic/Targets.cpp lib/Driver/ToolChains/Arch/ARM.cpp test/Driver/arm-features.c Index: test/Driver/arm-features.c === --- test/Driver/arm-features.c +++ test/Driver/arm-features.c @@ -7,6 +7,8 @@ // RUN: %clang -target arm-none-none-eabi -mcpu=generic+dsp -march=armv8m.main -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-DSP %s // RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8m.main+dsp -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-DSP %s // CHECK-DSP: "-cc1"{{.*}} "-triple" "thumbv8m.main-{{.*}} "-target-cpu" "generic"{{.*}} "-target-feature" "+dsp" +// RUN: %clang -target arm-none-none-eabi -mread-tp-hard -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-READTP %s +// CHECK-READTP: "-target-feature" "+read-tp-hard" // RUN: %clang -target arm-none-none-eabi -mcpu=generic+nocrc -march=armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRC %s // RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8a+nocrc -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRC %s Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -283,6 +283,10 @@ } } + // Setting the way of reading thread pointer. + if (Args.getLastArg(options::OPT_mread_tp_hard)) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); StringRef ArchName; Index: lib/Basic/Targets.cpp === --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -5094,6 +5094,7 @@ unsigned Crypto : 1; unsigned DSP : 1; unsigned Unaligned : 1; + unsigned ReadTpHard : 1; enum { LDREX_B = (1 << 0), /// byte (8-bit) @@ -5486,6 +5487,7 @@ Unaligned = 1; SoftFloat = SoftFloatABI = false; HWDiv = 0; +ReadTpHard = false; // This does not diagnose illegal cases like having both // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp". @@ -5526,7 +5528,8 @@ Unaligned = 0; } else if (Feature == "+fp16") { HW_FP |= HW_FP_HP; - } + } else if (Feature == "+read-tp-hard") +ReadTpHard = true; } HW_FP &= ~HW_FP_remove; Index: include/clang/Driver/Options.td === --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -1651,6 +1651,8 @@ HelpText<"Disallow generation of data access to code sections (ARM only)">; def mno_execute_only : Flag<["-"], "mno-execute-only">, Group, HelpText<"Allow generation of data access to code sections (ARM only)">; +def mread_tp_hard : Flag<["-"], "mread-tp-hard">, Group, + HelpText<"Read thread pointer from coprocessor register (ARM only)">; def mpure_code : Flag<["-"], "mpure-code">, Alias; // Alias for GCC compatibility def mno_pure_code : Flag<["-"], "mno-pure-code">, Alias; def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group; Index: test/Driver/arm-features.c === --- test/Driver/arm-features.c +++ test/Driver/arm-features.c @@ -7,6 +7,8 @@ // RUN: %clang -target arm-none-none-eabi -mcpu=generic+dsp -march=armv8m.main -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-DSP %s // RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8m.main+dsp -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-DSP %s // CHECK-DSP: "-cc1"{{.*}} "-triple" "thumbv8m.main-{{.*}} "-target-cpu" "generic"{{.*}} "-target-feature" "+dsp" +// RUN: %clang -target arm-none-none-eabi -mread-tp-hard -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-READTP %s +// CHECK-READTP: "-target-feature" "+read-tp-hard" // RUN: %clang -target arm-none-none-eabi -mcpu=generic+nocrc -march=armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRC %s // RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8a+nocrc -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRC %s Index: lib/Driver/ToolChains/Arch/ARM.cpp === --- lib/Driver/ToolChains/Arch/ARM.cpp +++ lib/Driver/ToolChains/Arch/ARM.cpp @@ -283,6 +283,10 @@ } } + // Setting the way of reading thread pointer. + if (Args.getLastArg(options::OPT_mread_tp_hard)) +Features.push_back("+read-tp-hard"); + // Check -march. ClangAs gives preference to -Wa,-march=. const Arg