Problem with MachineFunctionPass and JMP

Hi !

I'm trying to modify the code in a machine function pass…
I added a new basicblock and I want to add a jump to an another BB from my new BB.

Here is my code :

bool Obfuscation::runOnMachineFunction(MachineFunction &MF) {
   MachineBasicBlock *newEntry = MF.CreateMachineBasicBlock();
   MF.insert(MF.begin(), newEntry);
   std::vector<MachineBasicBlock*> origBB;

   for(MachineFunction::iterator i = MF.begin(); i != MF.end(); ++i)
      origBB.push_back(i);

   for(unsigned int i = 0; i < origBB.size(); ++i)
      origBB.at(i)->moveAfter(newEntry);

   MCInstrInfo tii = *MF.getTarget().getInstrInfo();
   MachineInstr *plop = BuildMI(MF, DebugLoc(),tii.get(X86::JMP_4)).addMBB(origBB.at(1));
   newEntry->push_back(plop);

   return false;
}

And here is the resulting code (it's a simple program with some 'if'):

(null) BB#4
JMP_4 <BB#0>
if.end BB#3
%RDI<def> = LEA64r %RIP, 1, %noreg, <ga:@.str2>, %noreg
ADJCALLSTACKDOWN64 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
%AL<def> = MOV8ri 0
CALL64pcrel32 <ga:@printf>, <regmask>, %RSP<imp-use>, %AL<imp-use,kill>, %RDI<imp-use,kill>, %EAX<imp-def>
ADJCALLSTACKUP64 0, 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
%ECX<def> = MOV32ri 25
MOV32mr <fi#8>, 1, %noreg, 0, %noreg, %EAX<kill>; mem:ST4[FixedStack8]
%EAX<def> = COPY %ECX<kill>
RET %EAX<imp-use,kill>
if.else BB#2
%RDI<def> = LEA64r %RIP, 1, %noreg, <ga:@.str1>, %noreg
ADJCALLSTACKDOWN64 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
%AL<def> = MOV8ri 0
CALL64pcrel32 <ga:@printf>, <regmask>, %RSP<imp-use>, %AL<imp-use,kill>, %RDI<imp-use,kill>, %EAX<imp-def>
ADJCALLSTACKUP64 0, 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
MOV32mr <fi#7>, 1, %noreg, 0, %noreg, %EAX<kill>; mem:ST4[FixedStack7]
if.then BB#1
%RDI<def> = LEA64r %RIP, 1, %noreg, <ga:@.str>, %noreg
ADJCALLSTACKDOWN64 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
%AL<def> = MOV8ri 0
CALL64pcrel32 <ga:@printf>, <regmask>, %RSP<imp-use>, %AL<imp-use,kill>, %RDI<imp-use,kill>, %EAX<imp-def>
ADJCALLSTACKUP64 0, 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
MOV32mr <fi#6>, 1, %noreg, 0, %noreg, %EAX<kill>; mem:ST4[FixedStack6]
JMP_4 <BB#3>
entry BB#0
MOV32mi <fi#0>, 1, %noreg, 0, %noreg, 0
MOV32mr <fi#1>, 1, %noreg, 0, %noreg, %EDI<kill>
MOV64mr <fi#2>, 1, %noreg, 0, %noreg, %RSI<kill>
MOV32mi <fi#3>, 1, %noreg, 0, %noreg, 0
MOV32mi <fi#4>, 1, %noreg, 0, %noreg, 4
%EDI<def> = MOV32rm <fi#3>, 1, %noreg, 0, %noreg
%EDI<def,tied1> = SUB32rm %EDI<tied0>, <fi#4>, 1, %noreg, 0, %noreg, %EFLAGS<imp-def>
MOV32mr <fi#5>, 1, %noreg, 0, %noreg, %EDI<kill>
%RSI<def> = MOV64rm <fi#2>, 1, %noreg, 0, %noreg
%RDI<def> = MOV64rm %RSI<kill>, 1, %noreg, 8, %noreg
ADJCALLSTACKDOWN64 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
CALL64pcrel32 <ga:@atoi>, <regmask>, %RSP<imp-use>, %RDI<imp-use,kill>, %EAX<imp-def>
ADJCALLSTACKUP64 0, 0, %RSP<imp-def>, %EFLAGS<imp-def>, %RSP<imp-use>
CMP32ri %EAX<kill>, 5, %EFLAGS<imp-def>
JNE_4 <BB#2>, %EFLAGS<imp-use>

But at the end, I get this error : fatal error: error in backend: unsupported relocation of undefined symbol 'LBB0_0'

Any idea on what can the problem be ?

Thx, cheers

Ok, I found the problem !
You have to add the successor BB before adding the jump:

newEntry->addSuccessor(origBB.at(1));

Cheers