The crash can be reproduced with the following command on an x86 machine:
$ clang -arch arm64 -mtune=native -c hello.c
The bug is in AddAArch64TargetArgs where it invokes A->getAsString(Args) without checking A is null (and local variable A isn't initialized in this function).
In this patch, I changed the line to first check if A is null. If it is null, it will print either "native" or the target CPU name getAArchTargetCPU returns. I added the check for "native" so that the cpu name provided by the user using -mtune or -mcpu is printed rather than the host cpu name (e.g., haswell):
clang-3.8: error: the clang compiler does not support 'native'
You don't need the IsValid flag, since if the returned vector is empty, it has the same semantics.
Also, you're returning the vector by value, whereas the pattern used in this file is to pass a reference to the vector as an argument.