mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
5b6af7163d
This changes the MachineFrameInfo API to use the new SSPLayoutKind information produced by the StackProtector pass (instead of a boolean flag) and updates a few pass dependencies (to preserve the SSP analysis). The stack layout follows the same approach used prior to this change - i.e., only LargeArray stack objects will be placed near the canary and everything else will be laid out normally. After this change, structures containing large arrays will also be placed near the canary - a case previously missed by the old implementation. Out of tree targets will need to update their usage of MachineFrameInfo::CreateStackObject to remove the MayNeedSP argument. The next patch will implement the rules for sspstrong and sspreq. The end goal is to support ssp-strong stack layout rules. WIP. Differential Revision: http://llvm-reviews.chandlerc.com/D2158 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197653 91177308-0d34-0410-b5e6-96231b3b80d8
91 lines
2.7 KiB
C++
91 lines
2.7 KiB
C++
//===- HexagonRemoveExtendArgs.cpp - Remove unnecessary argument sign extends //
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Pass that removes sign extends for function parameters. These parameters
|
|
// are already sign extended by the caller per Hexagon's ABI
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "Hexagon.h"
|
|
#include "HexagonTargetMachine.h"
|
|
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/Instructions.h"
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Transforms/Scalar.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace llvm {
|
|
void initializeHexagonRemoveExtendArgsPass(PassRegistry&);
|
|
}
|
|
|
|
namespace {
|
|
struct HexagonRemoveExtendArgs : public FunctionPass {
|
|
public:
|
|
static char ID;
|
|
HexagonRemoveExtendArgs() : FunctionPass(ID) {
|
|
initializeHexagonRemoveExtendArgsPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
virtual bool runOnFunction(Function &F);
|
|
|
|
const char *getPassName() const {
|
|
return "Remove sign extends";
|
|
}
|
|
|
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.addRequired<MachineFunctionAnalysis>();
|
|
AU.addPreserved<MachineFunctionAnalysis>();
|
|
AU.addPreserved("stack-protector");
|
|
FunctionPass::getAnalysisUsage(AU);
|
|
}
|
|
};
|
|
}
|
|
|
|
char HexagonRemoveExtendArgs::ID = 0;
|
|
|
|
INITIALIZE_PASS(HexagonRemoveExtendArgs, "reargs",
|
|
"Remove Sign and Zero Extends for Args", false, false)
|
|
|
|
bool HexagonRemoveExtendArgs::runOnFunction(Function &F) {
|
|
unsigned Idx = 1;
|
|
for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end(); AI != AE;
|
|
++AI, ++Idx) {
|
|
if (F.getAttributes().hasAttribute(Idx, Attribute::SExt)) {
|
|
Argument* Arg = AI;
|
|
if (!isa<PointerType>(Arg->getType())) {
|
|
for (Instruction::use_iterator UI = Arg->use_begin();
|
|
UI != Arg->use_end();) {
|
|
if (isa<SExtInst>(*UI)) {
|
|
Instruction* Use = cast<Instruction>(*UI);
|
|
SExtInst* SI = new SExtInst(Arg, Use->getType());
|
|
assert (EVT::getEVT(SI->getType()) ==
|
|
(EVT::getEVT(Use->getType())));
|
|
++UI;
|
|
Use->replaceAllUsesWith(SI);
|
|
Instruction* First = F.getEntryBlock().begin();
|
|
SI->insertBefore(First);
|
|
Use->eraseFromParent();
|
|
} else {
|
|
++UI;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
FunctionPass*
|
|
llvm::createHexagonRemoveExtendArgs(const HexagonTargetMachine &TM) {
|
|
return new HexagonRemoveExtendArgs();
|
|
}
|