@@ -145,6 +145,71 @@ MCSymbol *BPFAsmPrinter::getJTPublicSymbol(unsigned JTI) {
145145 return S;
146146}
147147
148+ MCSymbol *BPFAsmPrinter::getJTPublicSymbol (const BlockAddress *BA) {
149+ BasicBlock *BB = BA->getBasicBlock ();
150+
151+ MachineBasicBlock *MBB = nullptr ;
152+ for (MachineBasicBlock &MB : *MF) {
153+ if (MB.getBasicBlock () == BB) {
154+ MBB = &MB;
155+ break ;
156+ }
157+ }
158+ assert (MBB);
159+
160+ std::vector<MachineBasicBlock *> Targets;
161+ Targets.push_back (MBB);
162+
163+ unsigned JTI =
164+ MF->getOrCreateJumpTableInfo (MachineJumpTableInfo::EK_LabelDifference32)
165+ ->createJumpTableIndex (Targets);
166+ return getJTPublicSymbol (JTI);
167+ }
168+
169+ MCSymbol *BPFAsmPrinter::getJTPublicSymbol (const GlobalValue *GVal) {
170+ auto *GV = dyn_cast<GlobalVariable>(GVal);
171+ if (!GV)
172+ return NULL ;
173+ if (GV->getLinkage () != GlobalValue::PrivateLinkage)
174+ return NULL ;
175+ if (!GV->isConstant () || !GV->hasInitializer ())
176+ return NULL ;
177+
178+ const Constant *CV = dyn_cast<Constant>(GV->getInitializer ());
179+ if (!CV)
180+ return NULL ;
181+ const ConstantArray *CA = dyn_cast<ConstantArray>(CV);
182+ if (!CA)
183+ return NULL ;
184+
185+ for (unsigned i = 0 , e = CA->getNumOperands (); i != e; ++i) {
186+ if (!dyn_cast<BlockAddress>(CA->getOperand (i)))
187+ return NULL ;
188+ }
189+
190+ std::vector<MachineBasicBlock *> Targets;
191+ for (unsigned i = 0 , e = CA->getNumOperands (); i != e; ++i) {
192+ BlockAddress *BA = dyn_cast<BlockAddress>(CA->getOperand (i));
193+ BasicBlock *BB = BA->getBasicBlock ();
194+
195+ MachineBasicBlock *MBB = nullptr ;
196+ for (MachineBasicBlock &MB : *MF) {
197+ if (MB.getBasicBlock () == BB) {
198+ MBB = &MB;
199+ break ;
200+ }
201+ }
202+
203+ Targets.push_back (MBB);
204+ }
205+ assert (Targets.size ());
206+
207+ unsigned JTI =
208+ MF->getOrCreateJumpTableInfo (MachineJumpTableInfo::EK_LabelDifference32)
209+ ->createJumpTableIndex (Targets);
210+ return getJTPublicSymbol (JTI);
211+ }
212+
148213void BPFAsmPrinter::emitJumpTableInfo () {
149214 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo ();
150215 if (!MJTI)
0 commit comments