The issue is that clang was first creating a extern_weak hidden GV and then changing the linkage to external.
Once we know it is not extern_weak we know it must be dso_local.
This patch refactors the code that sets the implicit dso_local to a helper private function that is used every time we change the linkage or visibility.
Can this flip back and forth? That is, if setDSOLocal(true) was set before, do we need to handle the else-branch here and do setDSOLocal(false)?