On Sun, 5 May 2019 at 17:09, Joan Lluch via llvm-dev
<llvm...@lists.llvm.org> wrote:
> this gets converted by Clang into this:
>
> %localBuff = alloca [20 x i8], align 16
> %localBuff2 = alloca [6 x i8], align 1
Is that when Clang is compiling for your target, or maybe you copied
x86 code into your target?
Because this ought to be controlled by "LargeArrayMinSize" and
"LargeArrayAlign" in lib/Basic/Targets/XYZ.cpp, and only x86 and
WebAssembly seem to set the value to 16. The default never increases
the alignment as far as I can tell.
> - Otherwise, is there a way to override that alignment on the LLVM backend implementation, particularly to get it create frame index offsets aligned by a smaller size, thus ignoring the clang specified alignment?
I don't think it's the kind of thing you can (or should) override in
the backend. Other bits of code could have been relying on it from the
start (e.g. to store 3 bits of whatever in the low part of a pointer),
and earlier optimizations might have made even more assumptions based
on that value.
Cheers.
Tim.
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
On Sun, 5 May 2019 at 17:54, Joan Lluch <joan....@icloud.com> wrote:
> I have implemented all the steps to register a target backend for LLVM and so far I’m doing ok with it, but I do not know how to select a particular target on Clang. I just modified the “TargetInfo.cpp” file as I posted on my previous email to get 16 bit ints. So, any more insights will be appreciated.
There are probably about 5-10 different places that need at least
basic modification for a new target in Clang. It's something done
pretty rarely so there's not really any documentation, I'd suggest
grepping the source for an existing target (e.g. aarch64) and
copy/pasting that with modifications for yours.
This will mostly involve creating a few new subclasses for your
target, and telling generic clang code about them in one or two spots,
but I'm afraid I don't recall exact files & lines.
If you can run "clang -target myarch-none-elf" and get a Module
targeting your CPU (i.e. with the correct "target triple" and
"datalayout") that's a good first step. At some point you'll want to
actually think about the ABI decisions you've made and perhaps modify
them (like this array issue), but to begin with you can leave it as
is.
> On the other hand I’m unable to find LargeArrayMinSize in any project files (not even in lib/Basic/Targets/X86.cpp)
Sorry, I think that may actually be "LargeArrayMinWidth". I
investigated on a different computer to where I typed up my first
reply so didn't have the exact text on screen.
> LargeArrayAlign is only in TargetInfo.h and TargetInfo.cpp which is set to a value of 0 (Zero)
The default is set to 0 in TargetInfo.cpp, but I see it overridden in
X86.h, even in the 7.0 branch (again, typo in my original comment,
where I said .cpp). You'll be creating the equivalent file as part of
adding support to Clang for your target.
Are you looking in Clang's source, and that from the same 7.0 version?
If not, you should be. It traces back to 2010; r105500 to be exact:
https://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20100531/030985.html
For a long while references were in a single file (Targets.cpp), but
they'd been split up into one file per target before 7.0
(Targets/XYZ.cpp).
> I think there should be something else that causes my issue.
I think that's unlikely.
> Are you sure there’s nothing else beyond LargeArrayMinWidth that causes this?
No, but I am sure the LargeArray stuff exists and behaviour I see from
multiple targets matches what I'd expect from the values I see set in
the source.
Are you looking in Clang's source, and that from the same 7.0 version?
OK, so I've downloaded the official Clang released source
(https://releases.llvm.org/7.0.0/cfe-7.0.0.src.tar.xz), and:
$ tar xvf Downloads/cfe-7.0.0.src.tar.xz
[...]
$ cd cfe-7.0.0.src/
$ grep -r LargeArrayMinWidth .
./include/clang/Basic/TargetInfo.h: unsigned char LargeArrayMinWidth,
LargeArrayAlign;
./include/clang/Basic/TargetInfo.h: // getLargeArrayMinWidth/Align -
Return the minimum array size that is
./include/clang/Basic/TargetInfo.h: unsigned getLargeArrayMinWidth()
const { return LargeArrayMinWidth; }
./lib/Basic/TargetInfo.cpp: LargeArrayMinWidth = 0;
./lib/Basic/Targets/Hexagon.h: LargeArrayMinWidth = 64;
./lib/Basic/Targets/NVPTX.cpp: // - LargeArrayMinWidth,
LargeArrayAlign: Not visible across the
./lib/Basic/Targets/X86.h: LargeArrayMinWidth = 128;
./lib/Basic/Targets/WebAssembly.h: LargeArrayMinWidth = 128;
./lib/AST/ASTContext.cpp: unsigned MinWidth =
Target->getLargeArrayMinWidth();
I'm afraid I don't know what actually is happening here, but I think
the best explanation has to be that you're not actually looking at
Clang 7.0 source. That would definitely be my primary line of
investigation.
Ah. At least we now have a common view on the source, and hopefully
you can see what needs doing (even if Xcode won't reflect reality
properly for whatever reason).
> I assume this is a bug on one of the cmake install files.
As far as I'm aware LLVM has little to no Xcode magic in its CMake
files. So the bug would be in either CMake (supplying inadequate
dependencies?) or Xcode (misinterpreting CMake output?).
I'm afraid I don't really know enough about either to say which is
responsible. It could even be LLVM, though from what I *have* seen of
CMake, I'd be surprised if we needed to declare headers.