qiongsiwu1 added inline comments.

================
Comment at: clang/lib/Driver/ToolChains/Arch/PPC.cpp:54
+    auto TargetCPUName = llvm::StringSwitch<llvm::StringRef>(CPUName)
+                             .Case("common", "generic")
+                             .Case("440fp", "440")
----------------
jamieschmeiser wrote:
> This seems strange.  If the option is "generic", it calls 
> getPPCGenericTargetCPU(), but if it is "common", it returns "generic."  I 
> think you may want to also call getPPCGenericTargetCPU() here.  There should 
> probably also be an assume where this returns that it didn't return "generic" 
> if that is the intended result.  Also, there should also be tests for what 
> happens when "generic" and "common" are specified.
I agree this `generic` vs `common` behaviour is strange. They way this patch 
handles `generic` vs `common` keeps the existing behaviour. In short, before 
this patch, `clang` already treats `-mcpu=generic` and `-mcpu=common` 
differently. 

When `-mcpu=generic` is specified, we [[ 
https://github.com/llvm/llvm-project/blob/d3c3de63ce8416ab2dee7f784e54b00a2aa8ed85/clang/lib/Driver/ToolChains/CommonArgs.cpp#L420
 | do some processing depending ]] on the OS and architecture (effectively 
calling `getPPCGenericTargetCPU`). This happens because `generic` is not one of 
the cases of the big `StringSwitch`, and we return an empty string from 
`ppc::getPPCTargetCPU`.  

On the other hand, when `-mcpu=common` is specified, the `StringSwitch` maps 
`common` to `generic`, and we simply returns `generic` as the target CPU name 
[[ 
https://github.com/llvm/llvm-project/blob/d3c3de63ce8416ab2dee7f784e54b00a2aa8ed85/clang/lib/Driver/ToolChains/CommonArgs.cpp#L418
 | here ]]. 

**//Is this behaviour what we expect? //**If it is not, I will add a bug fix 
(with this patch or with a different patch if a separate one is easier to 
review). We only have an [[ 
https://github.com/llvm/llvm-project/blob/2c69e1d19a2b8bcf27ef1c5a4b5cc0410ed81a52/clang/test/Driver/ppc-cpus.c#L23
 |  existing test case ]] for `generic`, but not for `common`. I will add one 
with the bug fix. 


================
Comment at: clang/lib/Driver/ToolChains/Arch/PPC.cpp:77
+                             .Default(CPUName);
+    return TargetCPUName.str();
   }
----------------
jamieschmeiser wrote:
> Why did you change the type from const char *?  Couldn't you use 
> CPUName->data() in the default instead?  With your change, I think it may 
> need to create StringRefs around all of the choices and then just get the 
> string from them.
I was worried about the [[ 
https://github.com/llvm/llvm-project/blob/d3c3de63ce8416ab2dee7f784e54b00a2aa8ed85/llvm/include/llvm/ADT/StringRef.h#L129
 | comment ]] on top of `StringRef::data()` which says "Get a pointer to the 
start of the string (which may not be null terminated).". I was not sure what 
would happen if the data inside `CPUName` was not null terminated (it might be 
fine) so I thought it would be safer to use the `StringRef`s directly instead. 


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139720/new/

https://reviews.llvm.org/D139720

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to