llvm.js 4.3 KB
Newer Older
DCloud_JSON's avatar
DCloud_JSON 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
/*
Language: LLVM IR
Author: Michael Rodler <contact@f0rki.at>
Description: language used as intermediate representation in the LLVM compiler framework
Website: https://llvm.org/docs/LangRef.html
Category: assembler
Audit: 2020
*/

/** @type LanguageFn */
function llvm(hljs) {
  const regex = hljs.regex;
  const IDENT_RE = /([-a-zA-Z$._][\w$.-]*)/;
  const TYPE = {
    className: 'type',
    begin: /\bi\d+(?=\s|\b)/
  };
  const OPERATOR = {
    className: 'operator',
    relevance: 0,
    begin: /=/
  };
  const PUNCTUATION = {
    className: 'punctuation',
    relevance: 0,
    begin: /,/
  };
  const NUMBER = {
    className: 'number',
    variants: [
      { begin: /[su]?0[xX][KMLHR]?[a-fA-F0-9]+/ },
      { begin: /[-+]?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?/ }
    ],
    relevance: 0
  };
  const LABEL = {
    className: 'symbol',
    variants: [ { begin: /^\s*[a-z]+:/ }, // labels
    ],
    relevance: 0
  };
  const VARIABLE = {
    className: 'variable',
    variants: [
      { begin: regex.concat(/%/, IDENT_RE) },
      { begin: /%\d+/ },
      { begin: /#\d+/ },
    ]
  };
  const FUNCTION = {
    className: 'title',
    variants: [
      { begin: regex.concat(/@/, IDENT_RE) },
      { begin: /@\d+/ },
      { begin: regex.concat(/!/, IDENT_RE) },
      { begin: regex.concat(/!\d+/, IDENT_RE) },
      // https://llvm.org/docs/LangRef.html#namedmetadatastructure
      // obviously a single digit can also be used in this fashion
      { begin: /!\d+/ }
    ]
  };

  return {
    name: 'LLVM IR',
    // TODO: split into different categories of keywords
    keywords:
      'begin end true false declare define global '
      + 'constant private linker_private internal '
      + 'available_externally linkonce linkonce_odr weak '
      + 'weak_odr appending dllimport dllexport common '
      + 'default hidden protected extern_weak external '
      + 'thread_local zeroinitializer undef null to tail '
      + 'target triple datalayout volatile nuw nsw nnan '
      + 'ninf nsz arcp fast exact inbounds align '
      + 'addrspace section alias module asm sideeffect '
      + 'gc dbg linker_private_weak attributes blockaddress '
      + 'initialexec localdynamic localexec prefix unnamed_addr '
      + 'ccc fastcc coldcc x86_stdcallcc x86_fastcallcc '
      + 'arm_apcscc arm_aapcscc arm_aapcs_vfpcc ptx_device '
      + 'ptx_kernel intel_ocl_bicc msp430_intrcc spir_func '
      + 'spir_kernel x86_64_sysvcc x86_64_win64cc x86_thiscallcc '
      + 'cc c signext zeroext inreg sret nounwind '
      + 'noreturn noalias nocapture byval nest readnone '
      + 'readonly inlinehint noinline alwaysinline optsize ssp '
      + 'sspreq noredzone noimplicitfloat naked builtin cold '
      + 'nobuiltin noduplicate nonlazybind optnone returns_twice '
      + 'sanitize_address sanitize_memory sanitize_thread sspstrong '
      + 'uwtable returned type opaque eq ne slt sgt '
      + 'sle sge ult ugt ule uge oeq one olt ogt '
      + 'ole oge ord uno ueq une x acq_rel acquire '
      + 'alignstack atomic catch cleanup filter inteldialect '
      + 'max min monotonic nand personality release seq_cst '
      + 'singlethread umax umin unordered xchg add fadd '
      + 'sub fsub mul fmul udiv sdiv fdiv urem srem '
      + 'frem shl lshr ashr and or xor icmp fcmp '
      + 'phi call trunc zext sext fptrunc fpext uitofp '
      + 'sitofp fptoui fptosi inttoptr ptrtoint bitcast '
      + 'addrspacecast select va_arg ret br switch invoke '
      + 'unwind unreachable indirectbr landingpad resume '
      + 'malloc alloca free load store getelementptr '
      + 'extractelement insertelement shufflevector getresult '
      + 'extractvalue insertvalue atomicrmw cmpxchg fence '
      + 'argmemonly double',
    contains: [
      TYPE,
      // this matches "empty comments"...
      // ...because it's far more likely this is a statement terminator in
      // another language than an actual comment
      hljs.COMMENT(/;\s*$/, null, { relevance: 0 }),
      hljs.COMMENT(/;/, /$/),
      {
        className: 'string',
        begin: /"/,
        end: /"/,
        contains: [
          {
            className: 'char.escape',
            match: /\\\d\d/
          }
        ]
      },
      FUNCTION,
      PUNCTUATION,
      OPERATOR,
      VARIABLE,
      LABEL,
      NUMBER
    ]
  };
}

export { llvm as default };