def llvm100_to_70_ir(ir): """ Convert LLVM 10.0 IR for LLVM 7.0. """ buf = [] for line in ir.splitlines(): if line.startswith('attributes #'): # Remove function attributes unsupported by LLVM 7.0 m = re_attributes_def.match(line) attrs = m.group(1).split() attrs = ' '.join(a for a in attrs if a != 'willreturn') line = line.replace(m.group(1), attrs) if '!DISubprogram' in line: # Replace the DISPFlags (LLVM 10.0) with main subprogram DIFlags # (LLVM 7.0). Example: # # spflags: DISPFlagDefinition | DISPFlagOptimized # # becomes: # # isDefinition: true, isOptimized: true m = re_spflags.search(line) flags = m.group(1).split(' | ') new_flags = ", ".join([ '%s: true' % spflagmap[f] for f in flags ]) start_of_line = line[:m.span()[0]] end_of_line = line[m.span()[1] - 1:] line = start_of_line + new_flags + end_of_line buf.append(line) return '\n'.join(buf)
def llvm100_to_70_ir(ir): """ Convert LLVM 10.0 IR for LLVM 7.0. """ buf = [] for line in ir.splitlines(): if line.startswith('attributes #'): # Remove function attributes unsupported by LLVM 7.0 m = re_attributes_def.match(line) attrs = m.group(1).split() attrs = ' '.join(a for a in attrs if a != 'willreturn') line = line.replace(m.group(1), attrs) buf.append(line) return '\n'.join(buf)
def llvm39_to_34_ir(ir): """ Convert LLVM 3.9 IR for LLVM 3.4. """ def parse_out_leading_type(s): par_level = 0 pos = 0 # Parse out the first <ty> (which may be an aggregate type) while True: m = re_type_tok.search(s, pos) if m is None: # End of line raise RuntimeError("failed parsing leading type: %s" % (s, )) break pos = m.end() tok = m.group(0) if tok == ',': if par_level == 0: # End of operand break elif tok in '{[(': par_level += 1 elif tok in ')]}': par_level -= 1 return s[pos:].lstrip() buf = [] for line in ir.splitlines(): # Fix llvm.dbg.cu if line.startswith('!numba.llvm.dbg.cu'): line = line.replace('!numba.llvm.dbg.cu', '!llvm.dbg.cu') # We insert a dummy inlineasm to put debuginfo if (line.lstrip().startswith('tail call void asm sideeffect "// dbg') and '!numba.dbg' in line): # Fix the metadata line = line.replace('!numba.dbg', '!dbg') if re_metadata_def.match(line): # Rewrite metadata since LLVM 3.7 dropped the "metadata" type prefix. if None is re_metadata_correct_usage.search(line): # Reintroduce the "metadata" prefix line = line.replace('!{', 'metadata !{') line = line.replace('!"', 'metadata !"') assigpos = line.find('=') lhs, rhs = line[:assigpos + 1], line[assigpos + 1:] # Fix metadata reference def fix_metadata_ref(m): return 'metadata ' + m.group(0) line = ' '.join( (lhs, re_metadata_ref.sub(fix_metadata_ref, rhs))) if line.startswith('source_filename ='): continue # skip line if re_unsupported_keywords.search(line) is not None: line = re_unsupported_keywords.sub(lambda m: '', line) if line.startswith('attributes #'): # Remove function attributes unsupported pre-3.8 m = re_attributes_def.match(line) attrs = m.group(1).split() attrs = ' '.join(a for a in attrs if a in supported_attributes) line = line.replace(m.group(1), attrs) if 'getelementptr ' in line: # Rewrite "getelementptr ty, ty* ptr, ..." # to "getelementptr ty *ptr, ..." m = re_getelementptr.search(line) if m is None: raise RuntimeError("failed parsing getelementptr: %s" % (line, )) pos = m.end() line = line[:pos] + parse_out_leading_type(line[pos:]) if 'load ' in line: # Rewrite "load ty, ty* ptr" # to "load ty *ptr" m = re_load.search(line) if m: pos = m.end() line = line[:pos] + parse_out_leading_type(line[pos:]) if 'call ' in line: # Rewrite "call ty (...) @foo" # to "call ty (...)* @foo" line = re_call.sub(r"\1*\2", line) # Remove unknown annotations line = re_annotations.sub('', line) buf.append(line) return '\n'.join(buf)
def llvm39_to_34_ir(ir): """ Convert LLVM 3.9 IR for LLVM 3.4. """ def parse_out_leading_type(s): par_level = 0 pos = 0 # Parse out the first <ty> (which may be an aggregate type) while True: m = re_type_tok.search(s, pos) if m is None: # End of line raise RuntimeError("failed parsing leading type: %s" % (s,)) break pos = m.end() tok = m.group(0) if tok == ',': if par_level == 0: # End of operand break elif tok in '{[(': par_level += 1 elif tok in ')]}': par_level -= 1 return s[pos:].lstrip() buf = [] for line in ir.splitlines(): # Fix llvm.dbg.cu if line.startswith('!numba.llvm.dbg.cu'): line = line.replace('!numba.llvm.dbg.cu', '!llvm.dbg.cu') # We insert a dummy inlineasm to put debuginfo if (line.lstrip().startswith('tail call void asm sideeffect "// dbg') and '!numba.dbg' in line): # Fix the metadata line = line.replace('!numba.dbg', '!dbg') if re_metadata_def.match(line): # Rewrite metadata since LLVM 3.7 dropped the "metadata" type prefix. if None is re_metadata_correct_usage.search(line): # Reintroduce the "metadata" prefix line = line.replace('!{', 'metadata !{') line = line.replace('!"', 'metadata !"') assigpos = line.find('=') lhs, rhs = line[:assigpos + 1], line[assigpos + 1:] # Fix metadata reference def fix_metadata_ref(m): return 'metadata ' + m.group(0) line = ' '.join((lhs, re_metadata_ref.sub(fix_metadata_ref, rhs))) if line.startswith('source_filename ='): continue # skip line if re_unsupported_keywords.search(line) is not None: line = re_unsupported_keywords.sub(lambda m: '', line) if line.startswith('attributes #'): # Remove function attributes unsupported pre-3.8 m = re_attributes_def.match(line) attrs = m.group(1).split() attrs = ' '.join(a for a in attrs if a in supported_attributes) line = line.replace(m.group(1), attrs) if 'getelementptr ' in line: # Rewrite "getelementptr ty, ty* ptr, ..." # to "getelementptr ty *ptr, ..." m = re_getelementptr.search(line) if m is None: raise RuntimeError("failed parsing getelementptr: %s" % (line,)) pos = m.end() line = line[:pos] + parse_out_leading_type(line[pos:]) if 'load ' in line: # Rewrite "load ty, ty* ptr" # to "load ty *ptr" m = re_load.search(line) if m: pos = m.end() line = line[:pos] + parse_out_leading_type(line[pos:]) if 'call ' in line: # Rewrite "call ty (...) @foo" # to "call ty (...)* @foo" line = re_call.sub(r"\1*\2", line) # no !range metadata on calls line = re_range.sub('', line).rstrip(',') if '@llvm.memset' in line: line = re_parenthesized_list.sub( _replace_llvm_memset_usage, line, ) if 'declare' in line: if '@llvm.memset' in line: line = re_parenthesized_list.sub( _replace_llvm_memset_declaration, line, ) # Remove unknown annotations line = re_annotations.sub('', line) buf.append(line) return '\n'.join(buf)