LLVM: lib/Target/BPF/BPFAsmPrinter.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

39using namespace llvm;

40

41#define DEBUG_TYPE "asm-printer"

42

45

46

47 if (MAI->doesSupportDebugInformation() && !M.debug_compile_units().empty()) {

49 Handlers.push_back(std::unique_ptr(BTF));

50 }

51

52 return false;

53}

54

57}

58

60

61 const BPFSubtarget *Subtarget = getBTM().getSubtargetImpl();

63 std::vector<GlobalVariable *> Targets;

66 continue;

67 if (Global.isConstant() || Global.hasInitializer())

68 continue;

69

71 if (!CV)

72 continue;

74 if (!CA)

75 continue;

76

77 for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i) {

79 continue;

80 }

81 Targets.push_back(&Global);

82 }

83

86 GV->dropAllReferences();

87 GV->eraseFromParent();

88 }

89 }

90

92 if (!GO.hasExternalWeakLinkage())

93 continue;

94

95 if (!SawTrapCall && GO.getName() == BPF_TRAP) {

96 GO.eraseFromParent();

97 break;

98 }

99 }

100

102}

103

107

111 break;

112

115 break;

116

119 break;

120

123 break;

124

128 break;

129 }

130

133 break;

134

137 default:

139 }

140}

141

144 if (ExtraCode && ExtraCode[0])

146

148 return false;

149}

150

152 unsigned OpNum, const char *ExtraCode,

154 assert(OpNum + 1 < MI->getNumOperands() && "Insufficient operands");

157 assert(BaseMO.isReg() && "Unexpected base pointer for inline asm memory operand.");

158 assert(OffsetMO.isImm() && "Unexpected offset for inline asm memory operand.");

160

161 if (ExtraCode)

162 return true;

163

166 else

168

169 return false;

170}

171

173 if (MI->isCall()) {

175 if (Op.isGlobal()) {

177 if (GV->getName() == BPF_TRAP)

178 SawTrapCall = true;

179 }

180 }

181 }

182

183 BPF_MC::verifyInstructionPredicates(MI->getOpcode(),

185

187

188 if (!BTF || !BTF->InstLower(MI, TmpInst)) {

190 MCInstLowering.Lower(MI, TmpInst);

191 }

193}

194

198 << "BPF.JT." << MF->getFunctionNumber() << '.' << JTI;

200 if (auto *ES = static_cast<MCSymbolELF *>(S)) {

203 }

204 return S;

205}

206

209 if (!MJTI)

210 return;

211

212 const std::vector &JT = MJTI->getJumpTables();

213 if (JT.empty())

214 return;

215

218

221

226 for (unsigned JTI = 0; JTI < JT.size(); JTI++) {

228 if (JTBBs.empty())

229 continue;

230

238 }

239 const MCExpr *JTSize =

241 OutStreamer->emitELFSize(JTStart, JTSize);

242 }

243}

244

246

248 false)

249

250

252LLVMInitializeBPFAsmPrinter() {

256}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

This file contains support for writing BTF debug info.

#define LLVM_EXTERNAL_VISIBILITY

Module.h This file contains the declarations for the Module class.

This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...

#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)

static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")

static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")

This file describes how to lower LLVM code to machine code.

ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...

size_t size() const

size - Get the array size.

bool empty() const

empty - Check if the array is empty.

const TargetLoweringObjectFile & getObjFileLowering() const

Return information about object file lowering.

MCSymbol * getSymbol(const GlobalValue *GV) const

void EmitToStreamer(MCStreamer &S, const MCInst &Inst)

TargetMachine & TM

Target machine description.

const MCAsmInfo * MAI

Target Asm Printer information.

SmallVector< std::unique_ptr< AsmPrinterHandler >, 2 > Handlers

MachineFunction * MF

The current machine function.

bool doInitialization(Module &M) override

Set up the AsmPrinter when we are working on a new module.

MCContext & OutContext

This is the context for the output file that we are streaming.

bool doFinalization(Module &M) override

Shut down the asmprinter.

std::unique_ptr< MCStreamer > OutStreamer

This is the MCStreamer object for the file we are generating.

MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const

Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.

const DataLayout & getDataLayout() const

Return information about data layout.

MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const

Return the MCSymbol for the specified ExternalSymbol.

const MCSubtargetInfo & getSubtargetInfo() const

Return information about subtarget.

virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS)

Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.

MCSymbol * getJTPublicSymbol(unsigned JTI)

Definition BPFAsmPrinter.cpp:195

void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O)

Definition BPFAsmPrinter.cpp:104

bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, const char *ExtraCode, raw_ostream &O) override

Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant as...

Definition BPFAsmPrinter.cpp:151

bool doFinalization(Module &M) override

Shut down the asmprinter.

Definition BPFAsmPrinter.cpp:59

bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &O) override

Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.

Definition BPFAsmPrinter.cpp:142

bool doInitialization(Module &M) override

Set up the AsmPrinter when we are working on a new module.

Definition BPFAsmPrinter.cpp:43

void emitJumpTableInfo() override

Print assembly representations of the jump tables used by the current function to the current output ...

Definition BPFAsmPrinter.cpp:207

void emitInstruction(const MachineInstr *MI) override

Targets should implement this to emit instructions.

Definition BPFAsmPrinter.cpp:172

static const char * getRegisterName(MCRegister Reg)

void Lower(const MachineInstr *MI, MCInst &OutMI) const

Collect and emit BTF information.

ConstantArray - Constant Array Declarations.

This is an important base class in LLVM.

@ PrivateLinkage

Like Internal, but omit from symbol table.

static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)

static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)

Base class for the full range of assembler expressions which are needed for parsing.

Instances of this class represent a single low-level machine instruction.

Instances of this class represent a uniqued identifier for a section in the current translation unit.

MCSymbol * getBeginSymbol()

static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())

MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...

StringRef getName() const

getName - Get the symbol name.

LLVM_ABI MCSymbol * getSymbol() const

Return the MCSymbol for this basic block.

Representation of each machine instruction.

LLVM_ABI unsigned getEntrySize(const DataLayout &TD) const

getEntrySize - Return the size of each entry in the jump table.

@ EK_BlockAddress

EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.

JTEntryKind getEntryKind() const

const std::vector< MachineJumpTableEntry > & getJumpTables() const

MachineOperand class - Representation of each machine instruction operand.

const GlobalValue * getGlobal() const

bool isReg() const

isReg - Tests if this is a MO_Register operand.

MachineBasicBlock * getMBB() const

bool isImm() const

isImm - Tests if this is a MO_Immediate operand.

const BlockAddress * getBlockAddress() const

MachineOperandType getType() const

getType - Returns the MachineOperandType for this operand.

const char * getSymbolName() const

Register getReg() const

getReg - Returns the register number.

@ MO_Immediate

Immediate operand.

@ MO_ConstantPoolIndex

Address of indexed Constant in Constant Pool.

@ MO_GlobalAddress

Address of a global value.

@ MO_BlockAddress

Address of a basic block.

@ MO_MachineBasicBlock

MachineBasicBlock reference.

@ MO_Register

Register operand.

@ MO_ExternalSymbol

Name of external global symbol.

@ MO_JumpTableIndex

Address of indexed Jump Table for switch.

A Module instance is used to store all the information related to an LLVM module.

static LLVM_ABI PoisonValue * get(Type *T)

Static factory methods - Return an 'poison' object of the specified type.

SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...

virtual MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const

Value * getOperand(unsigned i) const

unsigned getNumOperands() const

This class implements an extremely fast bulk output stream that can only output to a stream.

A raw_ostream that writes to an SmallVector or SmallString.

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

This is an optimization pass for GlobalISel generic memory operations.

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

Target & getTheBPFleTarget()

Target & getTheBPFbeTarget()

Target & getTheBPFTarget()

@ Global

Append to llvm.global_dtors.

DWARFExpression::Operation Op

RegisterAsmPrinter - Helper template for registering a target specific assembly printer,...