[PATCH] CFE Knob for: Add a thread-model knob for lowering atomics on baremetal & single threaded systems
Jonathan Roelofs
jonathan at codesourcery.com
Wed Aug 20 12:06:40 PDT 2014
On 8/20/14, 12:31 PM, Aaron Ballman wrote:
> On Wed, Aug 20, 2014 at 11:39 AM, Jon Roelofs <jonathan at codesourcery.com> wrote:
>> Hi rengolin,
>>
>> Depends on: http://reviews.llvm.org/D4984
>>
>> http://reviews.llvm.org/D4985
>>
>> Files:
>> include/clang/Driver/CC1Options.td
>> include/clang/Driver/ToolChain.h
>> include/clang/Frontend/CodeGenOptions.h
>> lib/CodeGen/BackendUtil.cpp
>> lib/Driver/Tools.cpp
>> lib/Frontend/CompilerInvocation.cpp
>>
>> Index: lib/CodeGen/BackendUtil.cpp
>> ===================================================================
>> --- lib/CodeGen/BackendUtil.cpp
>> +++ lib/CodeGen/BackendUtil.cpp
>> @@ -419,6 +419,16 @@
>>
>> llvm::TargetOptions Options;
>>
>> + Options.ThreadModel = llvm::ThreadModel::POSIX;
>> + if (CodeGenOpts.ThreadModel == "POSIX") {
>> + Options.ThreadModel = llvm::ThreadModel::POSIX;
>> + } else if (CodeGenOpts.ThreadModel == "Single") {
>> + Options.ThreadModel = llvm::ThreadModel::Single;
>
> The braces should be elided for the if and else if.
Ok.
>
>> + } else {
>> + assert(false && "Invalid Thread model!");
>> + Options.ThreadModel = llvm::ThreadModel::POSIX;
>
> This assignment is redundant with the original initialization.
Ok.
>
>> + }
>
>
>
>> +
>> if (CodeGenOpts.DisableIntegratedAS)
>> Options.DisableIntegratedAS = true;
>>
>> Index: lib/Frontend/CompilerInvocation.cpp
>> ===================================================================
>> --- lib/Frontend/CompilerInvocation.cpp
>> +++ lib/Frontend/CompilerInvocation.cpp
>> @@ -437,6 +437,7 @@
>> Args.hasArg(OPT_cl_fast_relaxed_math);
>> Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
>> Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");
>> + Opts.ThreadModel = Args.getLastArgValue(OPT_mthread_model, "POSIX");
>> Opts.TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);
>> Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array);
>>
>> Index: lib/Driver/Tools.cpp
>> ===================================================================
>> --- lib/Driver/Tools.cpp
>> +++ lib/Driver/Tools.cpp
>> @@ -2776,6 +2776,9 @@
>> }
>> }
>>
>> + CmdArgs.push_back("-mthread-model");
>> + CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
>> +
>> if (!Args.hasFlag(options::OPT_fmerge_all_constants,
>> options::OPT_fno_merge_all_constants))
>> CmdArgs.push_back("-fno-merge-all-constants");
>> Index: include/clang/Frontend/CodeGenOptions.h
>> ===================================================================
>> --- include/clang/Frontend/CodeGenOptions.h
>> +++ include/clang/Frontend/CodeGenOptions.h
>> @@ -134,6 +134,9 @@
>> /// The name of the relocation model to use.
>> std::string RelocationModel;
>>
>> + /// The thread model to use
>> + std::string ThreadModel;
>> +
>> /// Path to blacklist file for sanitizers.
>> std::string SanitizerBlacklistFile;
>>
>> Index: include/clang/Driver/ToolChain.h
>> ===================================================================
>> --- include/clang/Driver/ToolChain.h
>> +++ include/clang/Driver/ToolChain.h
>> @@ -248,6 +248,9 @@
>> /// UseSjLjExceptions - Does this tool chain use SjLj exceptions.
>> virtual bool UseSjLjExceptions() const { return false; }
>>
>> + /// getThreadModel() - Which thread model does this target use?
>> + virtual std::string getThreadModel() const { return "POSIX"; }
>
> Why is this virtual? I don't see any overrides.
I have a currently-out-of-tree ToolChain that overrides it.
>
>> +
>> /// ComputeLLVMTriple - Return the LLVM target triple to use, after taking
>> /// command line arguments into account.
>> virtual std::string
>> Index: include/clang/Driver/CC1Options.td
>> ===================================================================
>> --- include/clang/Driver/CC1Options.td
>> +++ include/clang/Driver/CC1Options.td
>> @@ -218,6 +218,8 @@
>> HelpText<"Limit the number of registers available for integer arguments">;
>> def mrelocation_model : Separate<["-"], "mrelocation-model">,
>> HelpText<"The relocation model to use">;
>> +def mthread_model : Separate<["-"], "mthread-model">,
>> + HelpText<"The thread model to use">;
>
> The help text could be a bit more helpful, like what thread models are
> possible values.
How about: "The thread model to use. (e.g. POSIX, Single)" ?
Is there a better way to do a stringy-enum option, so that those get put in the
help text automatically?
>
>> def munwind_tables : Flag<["-"], "munwind-tables">,
>> HelpText<"Generate unwinding tables for all functions">;
>> def mconstructor_aliases : Flag<["-"], "mconstructor-aliases">,
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
> ~Aaron
>
--
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded
More information about the cfe-commits
mailing list