mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-03 17:02:03 +00:00
[AIX] Implement function descriptor on SDAG
Summary: (1) Function descriptor on AIX On AIX, a called routine may have 2 distinct symbols associated with it: * A function descriptor (Name) * A function entry point (.Name) The descriptor structure on AIX is the same as those in the ELF V1 ABI: * The address of the entry point of the function. * The TOC base address for the function. * The environment pointer. The descriptor symbol uses the same name as the source level function in C. The function entry point is analogous to the symbol we would generate for a function in a non-descriptor-based ABI, except that it is renamed by prepending a ".". Which symbol gets referenced depends on the context: * Taking the address of the function references the descriptor symbol. * Calling the function references the entry point symbol. (2) Speaking of implementation on AIX, for direct function call target, we create proper MCSymbol SDNode(e.g . ".foo") while constructing SDAG to replace original TargetGlobalAddress SDNode. Then down the path, we can take advantage of this MCSymbol. Patch by: Xiangling_L Reviewed by: sfertile, hubert.reinterpretcast, jasonliu, syzaara Differential Revision: https://reviews.llvm.org/D62532 llvm-svn: 362735
This commit is contained in:
parent
21b4baf3e9
commit
57335fbdaf
@ -48,6 +48,7 @@ protected:
|
||||
SymbolKindELF,
|
||||
SymbolKindMachO,
|
||||
SymbolKindWasm,
|
||||
SymbolKindXCOFF,
|
||||
};
|
||||
|
||||
/// A symbol can contain an Offset, or Value, or be Common, but never more
|
||||
@ -285,6 +286,8 @@ public:
|
||||
|
||||
bool isWasm() const { return Kind == SymbolKindWasm; }
|
||||
|
||||
bool isXCOFF() const { return Kind == SymbolKindXCOFF; }
|
||||
|
||||
/// @}
|
||||
/// \name Variable Symbols
|
||||
/// @{
|
||||
|
35
include/llvm/MC/MCSymbolXCOFF.h
Normal file
35
include/llvm/MC/MCSymbolXCOFF.h
Normal file
@ -0,0 +1,35 @@
|
||||
//===- MCSymbolXCOFF.h - ----------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#ifndef LLVM_MC_MCSYMBOLXCOFF_H
|
||||
#define LLVM_MC_MCSYMBOLXCOFF_H
|
||||
|
||||
#include "llvm/BinaryFormat/XCOFF.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/IR/GlobalValue.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class MCSymbolXCOFF : public MCSymbol {
|
||||
// The IR symbol this MCSymbolXCOFF is based on. It is set on function
|
||||
// entry point symbols when they are the callee operand of a direct call
|
||||
// SDNode.
|
||||
const GlobalValue *GV = nullptr;
|
||||
|
||||
public:
|
||||
MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary)
|
||||
: MCSymbol(SymbolKindXCOFF, Name, isTemporary) {}
|
||||
|
||||
void setGlobalValue(const GlobalValue *G) { GV = G; }
|
||||
const GlobalValue *getGlobalValue() const { return GV; }
|
||||
|
||||
static bool classof(const MCSymbol *S) { return S->isXCOFF(); }
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_MC_MCSYMBOLXCOFF_H
|
@ -201,6 +201,15 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
|
||||
return true;
|
||||
|
||||
if (!TargetPassConfig::willCompleteCodeGenPipeline()) {
|
||||
if (this->getTargetTriple().isOSAIX()) {
|
||||
// On AIX, we might manifest MCSymbols during SDAG lowering. For MIR
|
||||
// testing to be meaningful, we need to ensure that the symbols created
|
||||
// are MCSymbolXCOFF variants, which requires that
|
||||
// the TargetLoweringObjectFile instance has been initialized.
|
||||
MCContext &Ctx = MMI->getContext();
|
||||
const_cast<TargetLoweringObjectFile &>(*this->getObjFileLowering())
|
||||
.Initialize(Ctx, *this);
|
||||
}
|
||||
PM.add(createPrintMIRPass(Out));
|
||||
} else if (addAsmPrinter(PM, Out, DwoOut, FileType, MMI->getContext()))
|
||||
return true;
|
||||
|
@ -1877,6 +1877,13 @@ bool FastISel::selectOperator(const User *I, unsigned Opcode) {
|
||||
return false;
|
||||
|
||||
case Instruction::Call:
|
||||
// On AIX, call lowering uses the DAG-ISEL path currently so that the
|
||||
// callee of the direct function call instruction will be mapped to the
|
||||
// symbol for the function's entry point, which is distinct from the
|
||||
// function descriptor symbol. The latter is the symbol whose XCOFF symbol
|
||||
// name is the C-linkage name of the source level function.
|
||||
if (TM.getTargetTriple().isOSAIX())
|
||||
return false;
|
||||
return selectCall(I);
|
||||
|
||||
case Instruction::BitCast:
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "llvm/MC/MCSymbolELF.h"
|
||||
#include "llvm/MC/MCSymbolMachO.h"
|
||||
#include "llvm/MC/MCSymbolWasm.h"
|
||||
#include "llvm/MC/MCSymbolXCOFF.h"
|
||||
#include "llvm/MC/SectionKind.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
@ -162,8 +163,7 @@ MCSymbol *MCContext::createSymbolImpl(const StringMapEntry<bool> *Name,
|
||||
case MCObjectFileInfo::IsWasm:
|
||||
return new (Name, *this) MCSymbolWasm(Name, IsTemporary);
|
||||
case MCObjectFileInfo::IsXCOFF:
|
||||
// TODO: Need to implement class MCSymbolXCOFF.
|
||||
break;
|
||||
return new (Name, *this) MCSymbolXCOFF(Name, IsTemporary);
|
||||
}
|
||||
}
|
||||
return new (Name, *this) MCSymbol(MCSymbol::SymbolKindUnset, Name,
|
||||
|
@ -1964,6 +1964,13 @@ bool PPCFastISel::fastSelectInstruction(const Instruction *I) {
|
||||
case Instruction::Sub:
|
||||
return SelectBinaryIntOp(I, ISD::SUB);
|
||||
case Instruction::Call:
|
||||
// On AIX, call lowering uses the DAG-ISEL path currently so that the
|
||||
// callee of the direct function call instruction will be mapped to the
|
||||
// symbol for the function's entry point, which is distinct from the
|
||||
// function descriptor symbol. The latter is the symbol whose XCOFF symbol
|
||||
// name is the C-linkage name of the source level function.
|
||||
if (TM.getTargetTriple().isOSAIX())
|
||||
break;
|
||||
return selectCall(I);
|
||||
case Instruction::Ret:
|
||||
return SelectRet(I);
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
#include "llvm/CodeGen/MachineLoopInfo.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/RuntimeLibcalls.h"
|
||||
@ -69,8 +70,10 @@
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/Use.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSymbolXCOFF.h"
|
||||
#include "llvm/Support/AtomicOrdering.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
@ -4402,9 +4405,23 @@ static bool isFunctionGlobalAddress(SDValue Callee);
|
||||
static bool
|
||||
callsShareTOCBase(const Function *Caller, SDValue Callee,
|
||||
const TargetMachine &TM) {
|
||||
// If !G, Callee can be an external symbol.
|
||||
GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
|
||||
if (!G)
|
||||
// Need a GlobalValue to determine if a Caller and Callee share the same
|
||||
// TOCBase.
|
||||
const GlobalValue *GV = nullptr;
|
||||
|
||||
if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
|
||||
GV = G->getGlobal();
|
||||
} else if (MCSymbolSDNode *M = dyn_cast<MCSymbolSDNode>(Callee)) {
|
||||
// On AIX only, we replace GlobalAddressSDNode with MCSymbolSDNode for
|
||||
// the callee of a direct function call. The MCSymbolSDNode contains the
|
||||
// MCSymbol for the funtion entry point.
|
||||
const auto *S = cast<MCSymbolXCOFF>(M->getMCSymbol());
|
||||
GV = S->getGlobalValue();
|
||||
}
|
||||
|
||||
// If we failed to get a GlobalValue, then pessimistically assume they do not
|
||||
// share a TOCBase.
|
||||
if (!GV)
|
||||
return false;
|
||||
|
||||
// The medium and large code models are expected to provide a sufficiently
|
||||
@ -4413,13 +4430,12 @@ callsShareTOCBase(const Function *Caller, SDValue Callee,
|
||||
// only need to check that caller and callee don't cross dso boundaries.
|
||||
if (CodeModel::Medium == TM.getCodeModel() ||
|
||||
CodeModel::Large == TM.getCodeModel())
|
||||
return TM.shouldAssumeDSOLocal(*Caller->getParent(), G->getGlobal());
|
||||
return TM.shouldAssumeDSOLocal(*Caller->getParent(), GV);
|
||||
|
||||
// Otherwise we need to ensure callee and caller are in the same section,
|
||||
// since the linker may allocate multiple TOCs, and we don't know which
|
||||
// sections will belong to the same TOC base.
|
||||
|
||||
const GlobalValue *GV = G->getGlobal();
|
||||
if (!GV->isStrongDefinitionForLinker())
|
||||
return false;
|
||||
|
||||
@ -4891,7 +4907,8 @@ PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain,
|
||||
// we're building with the leopard linker or later, which automatically
|
||||
// synthesizes these stubs.
|
||||
const TargetMachine &TM = DAG.getTarget();
|
||||
const Module *Mod = DAG.getMachineFunction().getFunction().getParent();
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const Module *Mod = MF.getFunction().getParent();
|
||||
const GlobalValue *GV = nullptr;
|
||||
if (auto *G = dyn_cast<GlobalAddressSDNode>(Callee))
|
||||
GV = G->getGlobal();
|
||||
@ -4900,17 +4917,29 @@ PrepareCall(SelectionDAG &DAG, SDValue &Callee, SDValue &InFlag, SDValue &Chain,
|
||||
|
||||
if (isFunctionGlobalAddress(Callee)) {
|
||||
GlobalAddressSDNode *G = cast<GlobalAddressSDNode>(Callee);
|
||||
// A call to a TLS address is actually an indirect call to a
|
||||
// thread-specific pointer.
|
||||
unsigned OpFlags = 0;
|
||||
if (UsePlt)
|
||||
OpFlags = PPCII::MO_PLT;
|
||||
|
||||
// If the callee is a GlobalAddress/ExternalSymbol node (quite common,
|
||||
// every direct call is) turn it into a TargetGlobalAddress /
|
||||
// TargetExternalSymbol node so that legalize doesn't hack it.
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl,
|
||||
Callee.getValueType(), 0, OpFlags);
|
||||
if (TM.getTargetTriple().isOSAIX()) {
|
||||
// Direct function calls reference the symbol for the function's entry
|
||||
// point, which is named by inserting a "." before the function's
|
||||
// C-linkage name.
|
||||
auto &Context = MF.getMMI().getContext();
|
||||
MCSymbol *S = Context.getOrCreateSymbol(Twine(".") +
|
||||
Twine(G->getGlobal()->getName()));
|
||||
cast<MCSymbolXCOFF>(S)->setGlobalValue(GV);
|
||||
Callee = DAG.getMCSymbol(S, PtrVT);
|
||||
} else {
|
||||
// A call to a TLS address is actually an indirect call to a
|
||||
// thread-specific pointer.
|
||||
unsigned OpFlags = 0;
|
||||
if (UsePlt)
|
||||
OpFlags = PPCII::MO_PLT;
|
||||
|
||||
// If the callee is a GlobalAddress/ExternalSymbol node (quite common,
|
||||
// every direct call is) turn it into a TargetGlobalAddress /
|
||||
// TargetExternalSymbol node so that legalize doesn't hack it.
|
||||
Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl,
|
||||
Callee.getValueType(), 0, OpFlags);
|
||||
}
|
||||
needIndirectCall = false;
|
||||
}
|
||||
|
||||
|
@ -192,6 +192,12 @@ def : Pat<(PPCcall (i64 texternalsym:$dst)),
|
||||
def : Pat<(PPCcall_nop (i64 texternalsym:$dst)),
|
||||
(BL8_NOP texternalsym:$dst)>;
|
||||
|
||||
// Calls for AIX
|
||||
def : Pat<(PPCcall (i64 mcsym:$dst)),
|
||||
(BL8 mcsym:$dst)>;
|
||||
def : Pat<(PPCcall_nop (i64 mcsym:$dst)),
|
||||
(BL8_NOP mcsym:$dst)>;
|
||||
|
||||
// Atomic operations
|
||||
// FIXME: some of these might be used with constant operands. This will result
|
||||
// in constant materialization instructions that may be redundant. We currently
|
||||
|
@ -3032,12 +3032,16 @@ def : Pat<(and (rotl i32:$in, i32:$sh), maskimm32:$imm),
|
||||
// Calls
|
||||
def : Pat<(PPCcall (i32 tglobaladdr:$dst)),
|
||||
(BL tglobaladdr:$dst)>;
|
||||
def : Pat<(PPCcall_nop (i32 tglobaladdr:$dst)),
|
||||
(BL_NOP tglobaladdr:$dst)>;
|
||||
|
||||
def : Pat<(PPCcall (i32 texternalsym:$dst)),
|
||||
(BL texternalsym:$dst)>;
|
||||
|
||||
// Calls for AIX only
|
||||
def : Pat<(PPCcall (i32 mcsym:$dst)),
|
||||
(BL mcsym:$dst)>;
|
||||
def : Pat<(PPCcall_nop (i32 mcsym:$dst)),
|
||||
(BL_NOP mcsym:$dst)>;
|
||||
|
||||
def : Pat<(PPCtc_return (i32 tglobaladdr:$dst), imm:$imm),
|
||||
(TCRETURNdi tglobaladdr:$dst, imm:$imm)>;
|
||||
|
||||
|
@ -8,12 +8,12 @@ define void @call_test_char() {
|
||||
entry:
|
||||
; 32BIT: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1
|
||||
; 32BIT: $r3 = LI 97
|
||||
; 32BIT: BL_NOP @test_char, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_char>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
; 64BIT: $x3 = LI8 97
|
||||
; 64BIT: BL8_NOP @test_char, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_char>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_char(i8 signext 97)
|
||||
@ -27,7 +27,7 @@ entry:
|
||||
; 32BIT: $r4 = LI 97
|
||||
; 32BIT: $r5 = LI 97
|
||||
; 32BIT: $r6 = LI 97
|
||||
; 32BIT: BL_NOP @test_chars, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit killed $r5, implicit killed $r6, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_chars>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit killed $r5, implicit killed $r6, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
@ -35,7 +35,7 @@ entry:
|
||||
; 64BIT: $x4 = LI8 97
|
||||
; 64BIT: $x5 = LI8 97
|
||||
; 64BIT: $x6 = LI8 97
|
||||
; 64BIT: BL8_NOP @test_chars, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit killed $x4, implicit killed $x5, implicit killed $x6, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_chars>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit killed $x4, implicit killed $x5, implicit killed $x6, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_chars(i8 signext 97, i8 signext 97, i8 signext 97, i8 signext 97)
|
||||
@ -49,7 +49,7 @@ entry:
|
||||
; 32BIT: $r4 = LI 225
|
||||
; 32BIT: $r5 = LI 97
|
||||
; 32BIT: $r6 = LI -31
|
||||
; 32BIT: BL_NOP @test_chars_mix, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit killed $r5, implicit killed $r6, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_chars_mix>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit killed $r5, implicit killed $r6, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
@ -57,7 +57,7 @@ entry:
|
||||
; 64BIT: $x4 = LI8 225
|
||||
; 64BIT: $x5 = LI8 97
|
||||
; 64BIT: $x6 = LI8 -31
|
||||
; 64BIT: BL8_NOP @test_chars_mix, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit killed $x4, implicit killed $x5, implicit killed $x6, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_chars_mix>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit killed $x4, implicit killed $x5, implicit killed $x6, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_chars_mix(i8 signext 97, i8 zeroext -31, i8 zeroext 97, i8 signext -31)
|
||||
@ -68,12 +68,12 @@ define void @call_test_int() {
|
||||
entry:
|
||||
; 32BIT: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1
|
||||
; 32BIT: $r3 = LI 1
|
||||
; 32BIT: BL_NOP @test_int, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_int>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
; 64BIT: $x3 = LI8 1
|
||||
; 64BIT: BL8_NOP @test_int, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_int>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_int(i32 1)
|
||||
@ -91,7 +91,7 @@ entry:
|
||||
; 32BIT: $r8 = LI 1
|
||||
; 32BIT: $r9 = LI 1
|
||||
; 32BIT: $r10 = LI 1
|
||||
; 32BIT: BL_NOP @test_ints, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit killed $r5, implicit killed $r6, implicit killed $r7, implicit killed $r8, implicit killed $r9, implicit killed $r10, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_ints>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit killed $r5, implicit killed $r6, implicit killed $r7, implicit killed $r8, implicit killed $r9, implicit killed $r10, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
@ -103,7 +103,7 @@ entry:
|
||||
; 64BIT: $x8 = LI8 1
|
||||
; 64BIT: $x9 = LI8 1
|
||||
; 64BIT: $x10 = LI8 1
|
||||
; 64BIT: BL8_NOP @test_ints, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit killed $x4, implicit killed $x5, implicit killed $x6, implicit killed $x7, implicit killed $x8, implicit killed $x9, implicit killed $x10, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_ints>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit killed $x4, implicit killed $x5, implicit killed $x6, implicit killed $x7, implicit killed $x8, implicit killed $x9, implicit killed $x10, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_ints(i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1)
|
||||
@ -122,7 +122,7 @@ entry:
|
||||
; 64BIT: $x8 = LI8 1
|
||||
; 64BIT: $x9 = LI8 1
|
||||
; 64BIT: $x10 = LI8 1
|
||||
; 64BIT: BL8_NOP @test_ints_64bit, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x3, implicit killed $x4, implicit $x5, implicit killed $x6, implicit killed $x7, implicit killed $x8, implicit killed $x9, implicit killed $x10, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_ints_64bit>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x3, implicit killed $x4, implicit $x5, implicit killed $x6, implicit killed $x7, implicit killed $x8, implicit killed $x9, implicit killed $x10, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_ints_64bit(i32 signext 1, i32 zeroext 1, i32 zeroext 2147483648, i32 signext -2147483648, i32 signext 1, i32 signext 1, i32 signext 1, i32 signext 1)
|
||||
@ -133,12 +133,12 @@ define void @call_test_i1() {
|
||||
entry:
|
||||
; 32BIT: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1
|
||||
; 32BIT: $r3 = LI 1
|
||||
; 32BIT: BL_NOP @test_i1, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_i1>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
; 64BIT: $x3 = LI8 1
|
||||
; 64BIT: BL8_NOP @test_i1, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_i1>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_i1(i1 1)
|
||||
@ -150,12 +150,12 @@ entry:
|
||||
; 32BIT: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1
|
||||
; 32BIT: $r3 = LI 0
|
||||
; 32BIT: $r4 = LI 1
|
||||
; 32BIT: BL_NOP @test_i64, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_i64>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit killed $r3, implicit killed $r4, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
; 64BIT: $x3 = LI8 1
|
||||
; 64BIT: BL8_NOP @test_i64, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_i64>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit killed $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @test_i64(i64 1)
|
||||
@ -167,12 +167,12 @@ entry:
|
||||
%b = alloca i32, align 4
|
||||
; 32BIT: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1
|
||||
; 32BIT: renamable $r3 = ADDI %stack.0.b, 0
|
||||
; 32BIT: BL_NOP @test_int_ptr, csr_aix32, implicit-def dead $lr, implicit $rm, implicit $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .test_int_ptr>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit $r3, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
; 64BIT: renamable $x3 = ADDI8 %stack.0.b, 0
|
||||
; 64BIT: BL8_NOP @test_int_ptr, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .test_int_ptr>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x3, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
store i32 0, i32* %b, align 4
|
||||
|
@ -9,11 +9,11 @@ declare void @foo(...)
|
||||
define void @test_call() {
|
||||
entry:
|
||||
; 32BIT: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1
|
||||
; 32BIT: BL_NOP @foo, csr_aix32, implicit-def dead $lr, implicit $rm, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL_NOP <mcsymbol .foo>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
; 64BIT: BL8_NOP @foo, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8_NOP <mcsymbol .foo>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void bitcast (void (...)* @foo to void ()*)()
|
||||
@ -28,11 +28,11 @@ entry:
|
||||
define void @test_local_call() {
|
||||
entry:
|
||||
; 32BIT: ADJCALLSTACKDOWN 56, 0, implicit-def dead $r1, implicit $r1
|
||||
; 32BIT: BL @foo_local, csr_aix32, implicit-def dead $lr, implicit $rm, implicit $r2, implicit-def $r1
|
||||
; 32BIT: BL <mcsymbol .foo_local>, csr_aix32, implicit-def dead $lr, implicit $rm, implicit $r2, implicit-def $r1
|
||||
; 32BIT: ADJCALLSTACKUP 56, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
; 64BIT: ADJCALLSTACKDOWN 112, 0, implicit-def dead $r1, implicit $r1
|
||||
; 64BIT: BL8 @foo_local, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x2, implicit-def $r1
|
||||
; 64BIT: BL8 <mcsymbol .foo_local>, csr_aix64, implicit-def dead $lr8, implicit $rm, implicit $x2, implicit-def $r1
|
||||
; 64BIT: ADJCALLSTACKUP 112, 0, implicit-def dead $r1, implicit $r1
|
||||
|
||||
call void @foo_local()
|
||||
|
Loading…
Reference in New Issue
Block a user