llvm-6502/lib/Target/WebAssembly
JF Bastien 9994b911f4 Targets: commonize some stack realignment code
This patch does the following:
* Fix FIXME on `needsStackRealignment`: it is now shared between multiple targets, implemented in `TargetRegisterInfo`, and isn't `virtual` anymore. This will break out-of-tree targets, silently if they used `virtual` and with a build error if they used `override`.
* Factor out `canRealignStack` as a `virtual` function on `TargetRegisterInfo`, by default only looks for the `no-realign-stack` function attribute.

Multiple targets duplicated the same `needsStackRealignment` code:
 - Aarch64.
 - ARM.
 - Mips almost: had extra `DEBUG` diagnostic, which the default implementation now has.
 - PowerPC.
 - WebAssembly.
 - x86 almost: has an extra `-force-align-stack` option, which the default implementation now has.

The default implementation of `needsStackRealignment` used to just return `false`. My current patch changes the behavior by simply using the above shared behavior. This affects:
 - AMDGPU
 - BPF
 - CppBackend
 - MSP430
 - NVPTX
 - Sparc
 - SystemZ
 - XCore
 - Out-of-tree targets
This is a breaking change! `make check` passes.

The only implementation of the `virtual` function (besides the slight different in x86) was Hexagon (which did `MF.getFrameInfo()->getMaxAlignment() > 8`), and potentially some out-of-tree targets. Hexagon now uses the default implementation.

`needsStackRealignment` was being overwritten in `<Target>GenRegisterInfo.inc`, to return `false` as the default also did. That was odd and is now gone.

Reviewers: sunfish

Subscribers: aemerson, llvm-commits, jfb

Differential Revision: http://reviews.llvm.org/D11160

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242727 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-20 22:51:32 +00:00
..
InstPrinter
MCTargetDesc WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
TargetInfo
CMakeLists.txt WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
LLVMBuild.txt
Makefile WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
README.txt WebAssembly: add some TODO 2015-07-06 21:41:59 +00:00
WebAssembly.h
WebAssembly.td WebAssembly: start instructions 2015-07-01 23:41:25 +00:00
WebAssemblyFrameLowering.cpp WebAssembly: fix build breakage. 2015-07-14 23:06:07 +00:00
WebAssemblyFrameLowering.h WebAssembly: fix build breakage. 2015-07-14 23:06:07 +00:00
WebAssemblyInstrAtomics.td WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
WebAssemblyInstrCall.td WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
WebAssemblyInstrConv.td WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
WebAssemblyInstrFloat.td WebAssembly: add basic int/fp instruction codegen. 2015-07-14 21:13:29 +00:00
WebAssemblyInstrFormats.td WebAssembly: add basic int/fp instruction codegen. 2015-07-14 21:13:29 +00:00
WebAssemblyInstrInfo.cpp
WebAssemblyInstrInfo.h
WebAssemblyInstrInfo.td WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
WebAssemblyInstrInteger.td WebAssembly: add basic int/fp instruction codegen. 2015-07-14 21:13:29 +00:00
WebAssemblyInstrMemory.td WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
WebAssemblyInstrSIMD.td WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
WebAssemblyISelDAGToDAG.cpp
WebAssemblyISelLowering.cpp [WebAssembly] Set the scheduling preference. 2015-07-07 22:38:06 +00:00
WebAssemblyISelLowering.h
WebAssemblyMachineFunctionInfo.cpp
WebAssemblyMachineFunctionInfo.h
WebAssemblyRegisterInfo.cpp Targets: commonize some stack realignment code 2015-07-20 22:51:32 +00:00
WebAssemblyRegisterInfo.h Targets: commonize some stack realignment code 2015-07-20 22:51:32 +00:00
WebAssemblyRegisterInfo.td WebAssembly: basic instructions todo, and basic register info. 2015-07-10 18:23:10 +00:00
WebAssemblySelectionDAGInfo.cpp Unbreak WebAssembly build 2015-07-09 21:00:09 +00:00
WebAssemblySelectionDAGInfo.h Unbreak WebAssembly build 2015-07-09 21:00:09 +00:00
WebAssemblySubtarget.cpp Unbreak WebAssembly build 2015-07-09 21:00:09 +00:00
WebAssemblySubtarget.h WebAssembly: start instructions 2015-07-01 23:41:25 +00:00
WebAssemblyTargetMachine.cpp WebAssembly: start instructions 2015-07-01 23:41:25 +00:00
WebAssemblyTargetMachine.h
WebAssemblyTargetObjectFile.h Remove DataLayout from TargetLoweringObjectFile, redirect to Module 2015-07-16 06:04:17 +00:00
WebAssemblyTargetTransformInfo.cpp
WebAssemblyTargetTransformInfo.h Unbreak WebAssembly build 2015-07-09 21:00:09 +00:00

//===-- README.txt - Notes for WebAssembly code gen -----------------------===//

This WebAssembly backend is presently in a very early stage of development.
The code should build and not break anything else, but don't expect a lot more
at this point.

For more information on WebAssembly itself, see the design documents:
  * https://github.com/WebAssembly/design/blob/master/README.md

The following documents contain some information on the planned semantics and
binary encoding of WebAssembly itself:
  * https://github.com/WebAssembly/design/blob/master/AstSemantics.md
  * https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md

Interesting work that remains to be done:
* Write a pass to restructurize irreducible control flow. This needs to be done
  before register allocation to be efficient, because it may duplicate basic
  blocks and WebAssembly performs register allocation at a whole-function
  level. Note that LLVM's GPU code has such a pass, but it linearizes control
  flow (e.g. both sides of branches execute and are masked) which is undesirable
  for WebAssembly.
* Basic relooper to expose control flow as an AST.
* Figure out how to properly use MC for virtual ISAs. This may require some
  refactoring of MC.

//===---------------------------------------------------------------------===//