text:
The Christ Myth, first published in 1909, was a book by Arthur Drews on the Christ myth theory. Drews (1865–1935), along with Bruno Bauer (1809–1882) and Albert Kalthoff (1850–1906), is one of the three German pioneers of the denial of the existence of a historical Jesus.

History

19th-century historical criticism

Drews emphatically argues that no independent evidence for the historical existence of Jesus has ever been found outside the New Testament writings. He denounces the Romanticism of the liberal cult of Jesus (Der liberale Jesuskultus) as a violation of historical method, and the naive sentimentalism of historical theology which attributes the formation of Christianity to Jesus's "great personality".

He mentions the key names of historical criticism that emerged in the late 18th century and blossomed in the 19th century in Germany.
 Charles-François Dupuis (1742–1809) and Comte Constantin-François de Volney (1757–1820), the two French critical thinkers of the Enlightenment, who were the first to deny the historicity of Jesus on astromythical grounds, which they saw as key factors in the formation of religions including Christianity.
 David Strauss (1808–1874), who, at 27, pioneered the search for the historical Jesus with his Life of Jesus in 1835 (of 1,400 pages) by rejecting all the supernatural events as mythical elaborations.
 Bruno Bauer (1809–1882), the first academic theologian to affirm the non-historicity of Jesus. He claimed that Mark was the original Gospel, and the inventor of the historicity of Jesus. He traced the impact of major Greco-Roman ideas on the formation of the NT, especially the influence of Stoic philosophy (Seneca). Bruno Bauer's scholarship was buried by German academia, and he remained a pariah, until Albert Kalthoff rescued him from neglect and obscurity.
 Julius Wellhausen (1844–1918), an expert scholar of the Torah/Pentateuch, who was a leader in historical and source criticism;
 William Wrede (1859–1906), the promoter of the Messianic Secret in Mark, and who confirmed Bruno Bauer's claim that Mark was the real creator of Christianity;
 Johannes Weiss (1863–1914), the first exegete of the Gospels to attribute an apocalyptic vision to Jesus, accepted by Schweitzer and many others. He initiated form criticism later developed by Rudolf Bultmann. Weiss gave the name of Q to the "sayings of the Lord" common to Matthew and Luke. He was considered the highest authority in his time.
 G.J.P.J. Bolland (1854–1922), a Dutch autodidact radical, interested in Hegel and von Hartmann (letters from Drews to Bolland were published in German from 1890 to 1904), who saw the origin of Christianity in syncretism by Hellenized Jews in Alexandria;
 Albert Schweitzer (1875–1965), a historian of theology, who presented an important critical review of the history of the search for Jesus's life in  The Quest of the Historical Jesus – From Reimarus to Wrede (1906, first edition), denouncing the subjectivity of the various writers who injected their own preferences in Jesus's character. Schweitzer devotes three chapters to David Strauss (Ch. 7, 8, and 9), and a full chapter to Bruno Bauer (Ch. 11). Ch. 10 discusses the Priority of Mark hypothesis of Christian H. Weisse and Christian G. Wilke advanced in 1838.

Consequences of German historical criticism
Consequences have been dramatic.
 A general skepticism about the validity of the New Testament: "There is nothing, absolutely nothing, either in the actions or words of Jesus, that has not a mythical character or cannot be traced to parallel passages in the Old Testament or the Talmud. Historical criticism resolves all details of the Gospel story in mythical mist and makes it impossible to say that there ever was such a person" (Ch. 12).
 A loss of substance and meaning in the figure of the "historical Jesus": "But what [a liberal theologian] leaves intact of the personality and story of Jesus is so meagre, and so devoid of solid foundation, that it cannot claim any historical significance." (Ch. 8) The human Jesus of liberal theologians, found by reduction and elimination of supernatural and other unwanted features, is so bloodless that it could have never induced the emotional fervor of a new spiritual movement, let alone a new religion.

Syncretism

Drews uses the new findings of anthropology collected by James Frazer (1854–1941) with his descriptions of ancient pagan religions and the concept of dying-and-rising god. Drews also pays extreme attention to the social environment of religious movements, as he sees religion as the expression of the social soul.

Drews argues that the figure of Christ arose as a product of syncretism, a composite of mystical and apocalyptic ideas:

1. A Savior/Redeemer derived from the major prophets of the Old Testament and their images of:
- the suffering Servant of God (in Isaiah 53),
- the Suffering Victim (in Psalm 22),
- and the personification of Wisdom (in Wisdom of Solomon, Sirach and Proverbs)

2. The concept of Messiah liberator freeing the Jews in Palestine from Roman occupation and taxation.

3. Mixed with the patterns of Persian and Greco-Roman dying-and-rising godmen — godly heroes, kings, and emperors, whose stories inspired the new anthropological concept of dying and rising gods popularized by Frazer – such as Baal, Melqart, Adonis, Eshmun, Attis, Tammuz, Asclepius, Orpheus, Persephone, Inanna, also known as Ishtar, as well as Ra the Sun god, with its fusion with Osiris, Zalmoxis, Dionysus, and Odin, figuring in mystery cults of the Ancient Near East.

The Jesus Cult and the Mystery Cults
Drews points out the marked similarities of the early Christ cult to the existing and popular mystery cults – a theme already developed by W.B. Smith and J.M. Robertson, and later echoed by Maurice Goguel and reprised by the older brother of G.A. van den Bergh van Eysinga and van Eysinga himself. The rapid diffusion of the Christ religion took place in a population already shaped by and conversant with the sacred features of the mystery cults.

Mithras

The Christ Myth is sprinkled with comparisons between the Mithraic mysteries and the cult of Jesus. Although the god Mithras was not exactly a dying-and-rising god, some similarities are meaningful. Especially the sacramental feast which allowed the initiated to experience a mystical union with the god.

Mithraism, imported from Persia to Rome, spread rapidly through the Roman Empire in the 1st century, and was considered a certain rival to early Christianity. The major images show the god being born from a rock. The central theme is the hunting and killing a bull with blood gushing out. The sun was portrayed as a friend of Mithras, and banquets with him on the hide of the bull. Females played no part in the images or the cult. The cult was popular among soldiers, and was likely spread by them. Few initiates came from the social elite, until the revival in the mid-4th century (Emperor Julian). Drews claims that the figure of Jesus seemed more concrete, his story more moving, and it appealed more to women and the underdogs of society. The premature death of Emperor Julian was one of the causes of the Jesus mystery eventually winning over the Mithraic mysteries.

Christianity and the historical personality of Jesus

Drews asserted that everything about the story of Jesus had a mythical character, and that it was therefore not necessary to presuppose that a historical Jesus had ever existed. In fact, Christianity could have developed without Jesus, but not without Paul, and certainly not without Isaiah.

Drews concludes in the last chapter, "The Religious Problem of the Present": The Christ-faith arose quite independently of any historical personality known to us ;... Jesus was in this sense a product of the religious social soul and was made by Paul, with the required amount of reinterpretation and reconstruction, the chief interest of those communities founded by him. The historical Jesus is not earlier but later than Paul; and as such he has always existed merely as an idea, as a pious fiction in the minds of members of the community...the Gospels are the derivatives...for the propaganda of the Church, and being without any claim to historical significance...[Religion] is a group-religion...the connection of the religious community...[Our personal religion], a religion of the individual, a principle of personal salvation, would have been an offense and an absurdity to the whole of ancient Christendom. [emphasis added]

Christ Myth II – the witnesses to the historicity of Jesus (1912)

Critique of circular historical theology

Arthur Drews published a second part to his book, Die Christusmythe II: "Die Zeugnisse für die Geschichtlichkeit Jesu" (1911), to answer objections of scholars and critically examine the historical method of theologians. Joseph McCabe (1867–1955), who started life as a Roman Catholic priest, produced a translation of Christ Myth II as The Witnesses to the Historicity of Jesus (1912), published both in London and Chicago.

Historicity of Jesus

The preface of this classic book states: "The question of the historicity of Jesus [die Frage nach der Historizität von Jesus Christus] is a purely historical question to be settled with the resources of historical research."

In Ch. 3, "The Methods of Historical Criticism" of Part IV, "The Witness of the Gospels", Drews denounces the unscientific methodology principles of theological history which have been used in Schweitzer's The Quest for the Historical Jesus, the new theological vogue since David Strauss (1808–1874), and resulted in a long string of Lives of Jesus. Drews criticizes historical theology as not respecting the rules of non-Christian historical method, and giving way to "sentimental intuitions" and "basic circularity" of argumentation, where the existence of Jesus is presupposed, but not evidenced by outside sources. He takes as example the case of Johannes Weiss.
[C]ritics are convinced of the historicity of the gospels a priori, before investigating the subject...[They only have] to seek the "historical nucleus" in tradition...How is it that Weinel knows the [innermost nature] of Jesus so well before beginning his inquiry that he thinks he can determine by this test what is spurious in tradition and what is not?...The gospels, it seems, are to be understood from "the soul of Jesus", not from the soul of their authors!..Johannes Weiss... acknowledges that in all his inquiries he starts with the assumption that the gospel story in general has an historical root, that it has grown out of the soil of the life of Jesus, goes back to eye-witnesses of his life, and comes so near to him that we may count upon historical reminiscences...There is a further principle, that all that seems possible... may at once be set down as actual... [This is how] all theological constructions of the life of Jesus are based... the historicity of which is supposed to have been proved by showing that they are possible... Johannes Weiss is a master in...[this] way of interpreting the miracles of Jesus... If any one ventures to differ from him, Weiss bitterly retorts: "Any man who says that these religious ideas and emotions are inconceivable had better keep his hand off matters of religious history; he has no equipment to deal with them" [A classical response of theologians to skeptics.]...[In] Weiss's Das älteste Evangelium...he tries to prove that... Mark is merely incorporating an already existing tradition. "Not without certain assumptions", he admits, "do we set about the inquiry..." [emphasis added]

Drews, like Schweitzer in his Quest, focuses mostly on German liberal theologians, while mentioning Ernest Renan (1823–1892) only en passant. He completely ignores Baron d'Holbach (1723–1789), the first to publish a critical Life of Jesus, with his Ecce Homo! (Histoire critique de Jésus-Christ, ou Analyse raisonnée des évangiles) (1770).

The Jewish witnesses
 Philo: a Jewish contemporary of Jesus, knew of the Essenes, but makes no mention of Jesus or Christians.
 Justus of Tiberias: Drews mentions the curious case of Photius, the 9th-century Patriarch of Constantinople, who became famous for his Bibliotheca or Myriobiblon, a collection of excerpts and summaries of some 280 classical volumes now mostly lost. Photius read through the Chronicle of Justus of Tiberias, a contemporary of Josephus, who went through the Jewish Wars and the destruction of Jerusalem. Justus wrote a book about the War, and a Chronicle of the Jewish people from Moses to Agrippa II (27-c. 94 AD). "Photius himself believed there ought to be some mention of Jesus [in Justus's Chronicle], and was surprised to find none." [emphasis added]
 Josephus: pros and cons of the Testimonium Flavanium, concluding it is most likely an interpolation or alteration.
 Talmud: offers no contemporary report on Jesus, only later fragments from the Gospel tradition.

The Roman witnesses

 Pliny the Younger (61-c. 112 AD): his letter to Trajan of c. 110 AD (X, 96) only mentions the existence of a cult of Christians with an innocent early-morning ritual. This letter has aroused the suspicion of Bruno Bauer and Edwin Johnson.
 Suetonius (69–122 AD): the expulsion of Jews, making trouble at the instigation of an enigmatic Chrestus (impulsore Chresto), not spelled Christus, under Emperor Claudius leaves uncertain who Chrestus was, and does not support the historicity of a Jesus.
 Tacitus (56–117 AD): Next to Josephus, is host to the second most important non-Christian passage in Annals, XV, 44 (c. 115 AD). Nero lays the blame for the 64 AD fire of Rome on Christianos, followers of Christus, whose death was ordered by Pontius Pilate in Judaea, who is mentioned as procurator instead of prefect. This passage has given rise to an intense examination of pros and cons. Jesus, as a name, is not mentioned; Christianos seems to be a correction of an original Chrestianos; the persecution of Christians by Nero is doubtful, mentioned only in Sulpicius Severus (c. 400), whose text could have been interpolated back into Tacitus; Tacitus's source must have been, not the archives, but hearsay from Christians. The strange circumstances of the discovery of the manuscript in the 15th century also raised questions. A discussion on the authenticity of the Annals passage remains inconclusive.
 Lucus a non Lucendo, no evidence can be deduced from the destroyed pagan manuscripts.

The witness of Paul

The Epistles of Paul, and doubts about their authenticity: [The first ten epistles of Paul of Tarsus appeared around 140 AD, collected in Marcion's Apostolikon. Their lost text was reconstituted by Adolf von Harnack in Marcion: The Gospel of the Alien God, 1921]

The leader of the Tübingen School of theology, Ferdinand Christian (F.C.) Baur (1792–1860), in Paulus, der Apostel Jesu Christi (1845), had established as genuine the four chief Pauline Epistles — Romans, Galatians, First Corinthians and Second Corinthians — and that Paul in the Acts was different from the Paul of the Epistles.

Drews stresses that in the Germany of the 1900s, the genuineness of those four chief "Paulinae" (i.e. Paul's Epistles) "is so firmly held by [theologians] that any doubt about it is at once rejected by them as not to be taken seriously." This fear didn't stop from doubts the likes of:
 Bruno Bauer, the first to declare all Paul's epistles to be 2nd-century forgeries;
 the English radicals Edwin Johnson, John M. Robertson, Thomas Whittaker;
 the Dutch radicals G.J.P.J. Bolland, Willem C. Van Manen (with two key articles in English on "Paul & Paulinism" and Romans, and G.A. van den Bergh van Eysinga, all belonging to the famous Dutch Radical School, whose specialty was radical criticism of the Paulinae and denial of their authenticity;
 and Albert Kalthoff who revived Bruno Bauer's ideas and gave them a new shine.
Drews says it loud and clear: There's a vicious circle of methodology in historical theologians, and if they find Jesus, it's because they assume in advance he's already in the stories.
1. Proofs of the Historicity of Jesus in Paul
(a) Simple Proofs:

The Savior has to appear to be a real man. The law (Halakha) did not make men righteous, and so Jesus Christ was despatched to free men from the law, redeem them and deliver them from sin and death by his own sacrificial death. By his union with Christ, man becomes dead to the law and gains eternal life. Philo's Logos is a similar divine savior and mediator.Blended with the Liberator Messiah (who has to descend from David), the fusion results in a Suffering, Dying and Rising God. But this Mediator/Savior has to appear as a real man before his sacrifice — born of a woman under the law (Gal. 4:4) (a Jewish expression). The idea of a son of God sent as mediator to benefit mankind and confer redemption is abundant in Ancient Greek stories (Herakles, Dionysos), and Ancient Near East mysteries (Attis, Adonis, Osiris). Same idea in the Son of Man of the prophet Daniel. The God figure is linked to the cycle of nature and sun periodicity. Paul enlarged and deepened the idea. Gal. 4:1. The mention of the twelve in 1 Cor. 15:5 is a gloss.

(b) The Appearances of the Risen Christ.

About the "visions" in 1 Cor. 15: Is the whole episode fashioned according to the Scriptures? And the mention that Jesus resurrected appeared to more than 500 brothers seems an interpolation.

(c) The account of the Last Supper.

1 Cor. 11:23, has a suspicious liturgical form, while Mark and Matthew's accounts differ, and the phrase "in memory of me" is seen by many as a later interpolation. The betrayal by Judas is an invention, with paradidonai not meaning "betray", but "give up", (Isaiah, 53:12), while selecting the "night" for the action is pure stage setting. The preceding text, 1 Cor. 11:17–22, has been dealing with agape, the love-feast of early Christians, to which the text returns. 1 Cor. 27–33.

(d) The "brothers" of the Lord [vs brethren in Christ]

In 1 Cor. 9:5 and Gal. 1:19, has the phrase Brothers of the Lord a physical meaning and is it different from brethren in Christ (spiritual brotherhood in a sect or church)? This is an old controversy, but its conclusion remains obscure. "Missionary journeys" assigned to physical brothers seem highly improbable. James the Just is also called The Brother of the Lord (Gal. 1:19) because he is the most virtuous. Drews finds it impossible to define what kind of man this James is. Identifying who the man is (among the too many Jameses in the texts) remains utterly "hopeless".

(e) The "Words of the Lord."

[Those are the "sayings" of Jesus, their compilation first called Logia, after Papias of Hierapolis, and renamed the hypothetical "Q source" by Johannes Weiss (1863–1914).] There are many approximate parallels between Paul and Gospel sayings. Prohibition to part with a wife (1 Cor. 7:10 and Matthew 5:32). Making one's living through the Gospel (1 Cor. 9:14 and Matthew 10:10). Parousia in the clouds (1 Thessalonians 4:15 and Mark 13:26) etc. Who borrows from whom? From Paul into Gospels, or the reverse? Those sayings are not all exceptional, including many banal platitudes from Talmud (Romans 2:1 and Matthew 7:1); (Romans 2:19 and Matthew 15:14), etc.

2. Paul no witness to the historicity of Jesus

Paul was not concerned with the earthly life of Jesus, and his idea of Christ was formed independently of an historical Jesus. Wrede concurs: For Paul, only Jesus's death is important, and it is a "superhistorical" fact for Paul. Paul knew nothing of Jesus. Paul is not the disciple of a historical Jesus. Paul invokes no distinctive acts of the "Lord", no sayings of Jesus, even when it would have been most useful to his own preaching, for instance on the question of the law.

"[I]nstead of doing so, [Paul] uses the most complicated arguments from the Scriptures and the most determined dialectic, when he might have acted so much more simply." [Emphasis added.] Why not, for example, in Gal. 2:11–14 "in order to convince Peter that he is wrong in avoiding the tables of the Gentiles?".

Theologians have a ready-made "psychological" excuse to explain Paul's silence on Jesus' life: The epistles are occasional papers that never have reason to speak expressly about Jesus, as if everything about Jesus had already been communicated orally, and did not need to be repeated in the letters. Even when "[t]hese letters, [are] swarming with dogmatic discussions of the most subtle character", remarks Drews. It's one more excuse that theologians invent to conceal a major difficulty. Paul's Christ does not point to the Jesus of the Gospels.

3. The question of genuineness
 Drews examines the question of the authenticity of the Epistles, and the Historicity of Paul and starts with a reminder:The Pauline Christ is a metaphysical principle, and his incarnation only one in idea, an imaginary element of his religious system. The man Jesus is in Paul the idealised suffering servant of God of Isaiah and the just man of Wisdom an intermediate stage of metaphysical evolution, not an historical personality. [emphasis added]
Not a single trace of Paul has been found in the writings of Philo and Josephus. The Epistle of Clement is not reliable. There's no proof of the existence of the Pauline epistles before Justin. Papias of Hierapolis was also silent about them.

(a) Emotional arguments for the genuineness.

The only tools for analyzing the epistles are internal evidence and philology. Theologians rely on aesthetics, since there's no outside comparison to identify what they perceive as the distinctiveness of style. Theologians also resort to their "feeling" to detect the powerful personality of Paul, the uninventible originality of the epistles, they even claim they can sense his soul.

(b) Arguments for genuineness from the times.

Van Manen showed that the communities visited by Paul were complex organizations, not newly founded and young. They point to the middle of the 2nd century rather than the middle of the 1st. The Gnostic influence is noticeable. Gift of tongues, circumcisions were still issues in the 2nd century. Justin's Trypho showed that the two sides of established Jews versus sectarian Jewish-Christians (Nazarene) were still confronting each other as in Galatians. Only after the destruction of Jerusalem did Jews and Christians split, turning to enmity and hatred. Later Christians took the side of Romans against the Jews (135). Christians felt they were the new chosen, with a new Covenant, and the Jews had become outcasts and damned. In Romans 9-11 the Jews are excluded from salvation.Paulinism is very close to the Gnosticism of the 2nd century, Drews emphasizes:

 In one case the connection between Gnosticism and Paul is so evident that it may be cited as a proof that Paul knew nothing of an historical Jesus; it is the passage in 1 Cor. 2:6, where the apostle speaks of the princes of this world, who knew not what they did when they crucified the Lord of glory. It was long ago recognised by van Manen and others that by these princes we must understand, not the Jewish or Roman authorities, nor any terrestrial powers whatever, but the enemies of this world, the demons higher powers, which do indeed rule the earth for a time, but will pass away before the coming triumph of the saviour-God. That is precisely the Gnostic idea of the death of the Redeemer, and it is here put forward by Paul; from that we may infer that he did not conceive the life of Jesus as an historical event, but a general metaphysical drama, in which heaven and earth struggle for the mastery. [emphasis added]
Paul does use a lot of Gnostic language, which was understandable in the 2nd century, but not around 50–60 AD, given as the spurious dating of the Epistles. Not enough time had passed to elaborate and deepen the new thoughts. The Damascus vision is not enough to explain in Paul such a quick turn-around conversion from zealot Jew to fanatic Christian.

(c) The spuriousness of the Pauline Epistles.

Paul's Judaism is highly questionable. Consulted rabbis cannot recognize a student of Judaism in Paul. Paul is constantly referring only to the Septuagint, and there's no clue that he knew any Hebrew. He thinks Greek, speaks Greek, eats Greek, uses Greek in everything. Paulinism is much closer to the Hellenistic Judaism of Philo and Wisdom. Paul never shows any respect for the sacred texts, distorting or changing their meaning, as in Gal. 4:21. His mindset is unique, similar only to other 2nd-century writers, like Hebrews, Barnabas, Justin. The Epistles and the Acts present two radically different stories (F.C. Baur). The Dutch Radical School (Rudolf Steck and Willem C. van Manen) has mostly denied the authenticity of the Epistles. The Epistles' goal was to separate Christianity from Judaism. Many intriguing scenarios are possible about the character of Paul, a Jew who turned against the law and Judaism, to give freedom to the new cult: one writer, or many? But, for Drews's Christ Myth, the historicity of Paul is secondary.

The witness of the Gospels

This important part IV covers a complete text criticism and historical criticism of Gospel scholarship in 1912, in 14 chapters:

1. The Sources of the Gospels
2. The Witness of Tradition
3. The Methods of Historical Criticism
(a) The Methodical Principles of Theological History
(b) The Method of Johannes Weiss
4. The "Uniqueness" and "Uninventibility" of the Gospel Jesus
5. Schmiedel's [Nine] Main Pillars
6. The Methods of 'The Christ-Myth'
(a) The Literary Character of the Gospels.
(b) The Mythical Character of the Gospels.
 7. The Mythic-Symbolic Interpretation of the Gospels
(a) The Suffering and Exaltation of the Messiah.
(b) The Character and Miracles of the Messiah. — Supplement [On Job]
(c) John the Baptist and the Baptism of Jesus.
(d) The Name of the Messiah.
(e) The Topography of the Gospels.
 I. NAZARETH.
 II. JERUSALEM.
 III. GALILEE.

(f) The Chronology of the Gospels.
(g) The Pre-Christian Jesus.
(h) The Conversion of the Mythical into an Historical Jesus.
(i) Jesus and the Pharisees and Scribes.
(k) Further Modifications of Prophetical and Historical Passages.
8. Historians and the Gospels
9. The Words of the Lord [The "Sayings" of Jesus", the "Q source"]
(a) The Tradition of the Words of the Lord.
(b) The Controversies with the Pharisees.
(c) Sayings of Jesus on the Weak and Lowly.
(d) Jesus's Belief in God the Father
(e) Love of Neighbours and of Enemies.
(f) The Sermon on the Mount.
(g) Further Parallel Passages.
10. The Parables of Jesus
11. General Result
12. The "Strong Personality"
13. The Historical Jesus and the Ideal Christ
14. Idea and Personality: Settlement of the Religious Crisis
Appendix [Astral Speculations of the Ancients on Psalm 22]

The Suffering Servant of God in Isaiah 53

The book emphasized the role played in the formation of the figure of Jesus by the Old Testament character of The Suffering Servant in Isaiah 53, Jeremiah, Job, Zechariah, Ezechiel, etc. especially as presented in the Greek version of the Septuagint. Isaiah 52:13 – 53:12 ESV tells the story of the human scapegoat who, on God's will, is turned into an innocent lamb offered for sacrifice:3 He was despised and rejected by men; a man of sorrows, and acquainted with grief;... 4 Surely he has borne our griefs and carried our sorrows; yet we esteemed him stricken, smitten by God, and afflicted. 5 But he was pierced for our transgressions; he was crushed for our iniquities; upon him was the chastisement that brought us peace, and with his wounds we are healed. 6 All we like sheep have gone astray; we have turned—every one—to his own way; and the Lord has laid on him the iniquity of us all. 7... yet he opened not his mouth; like a lamb that is led to the slaughter... 8 By oppression and judgment he was taken away; ... stricken for the transgression of my people? 9 And they made his grave with the wicked... although he had done no violence, and there was no deceit in his mouth.10 Yet it was the will of the Lord to crush him... when his soul makes an offering for guilt... 11...by his knowledge shall the righteous one, my servant, make many to be accounted righteous, and he shall bear their iniquities. 12...because he poured out his soul to death and was numbered with the transgressors; yet he bore the sin of many, and makes intercession for the transgressors. [emphasis added]
In ch. 7, "The Mythic-Symbolic Interpretation of the Gospels", Drews writes:  The mythic-symbolic interpretation of the gospels sees in Isaiah 53 the germ-cell of the story of Jesus, the starting-point of all that is related of him, the solid nucleus round which all the rest has crystallised. The prophet deals with the Servant of Jahveh, who voluntarily submits to suffering in order to expiate the sin and guilt of the people. [emphasis added]

The Suffering Victim of Psalm 22

Isaiah 53 is seconded by the Suffering Victim in crucial Psalm 22, especially its lines: My God, my God, why have you forsaken me? (Psalm 22:1; Mark 15:34); They hurl insults, shaking their heads. (Psalm 22:7; Mark 15:29); They divide my clothes among them and cast lots for my garment. (Psalm 22:18; Mark 15:24). Other psalms present passages supporting the figure of the Suffering Servant of Yahweh (Psalm 1, 8, 15, 23, 24, 34, 37, 43, 69, 103, 109, 110, 116, 118, 121, 128, etc.)

The righteous as personification of wisdom, his persecution and death
Drews also underlines the contribution of the character of the Just or the Righteous in the Book of Wisdom, and Sirach.
- In "Wisdom 7:15–29", she is a breath of the power of God, a pure emanation of the glory of the Almighty.
- In "Wisdom 2:10–19" the wicked are plotting against the righteous man: Let us oppress the righteous poor man,
- and in "Wisdom 2:20" they decide Let us condemn him to a shameful death, for, according to what he says, he will be protected.

Drews adds: [Ch. 7, "The Mythic-Symbolic Interpretation of the Gospels"] According to Deuteronomy (21:23), there was no more shameful death than to hang on a tree (in Greek xylon and stauros, in Latin crux); so that this naturally occurred as the true manner of the just one's death. Then the particular motive of the death was furnished by the passage in Wisdom and the idea of Plato. He died as a victim of the unjust, the godless.

[Ch. 8, "Historians and the Gospels"] No one will question that the figure of Jesus in the gospels has a certain nucleus, about which all the rest has gradually crystallised. But that this nucleus is an historical personality, and not Isaiah's Servant of God, the Just of Wisdom, and the Sufferer of the 22d Psalm, is merely to beg the question; and this is the less justified since all the really important features of the gospel life of Jesus owe their origin partly to the myth, partly to the expansion and application of certain passages in the prophets.
[Ch. 13, "The Historical Jesus and the Ideal Christ"]...There is not in the centre of Christianity one particular historical human being, but the idea of man, of the suffering, struggling, humiliated, but victoriously emerging from all his humiliations, servant of God, symbolically represented in the actions and experiences of a particular historical person. [emphasis added]

Features of dying-and-rising God

In Chapter 13, Drews emphasizes the mystery cult character of early Christian ecstatic reverence:

Reception

Germany

Drews managed an intense advertising campaign in Germany with lectures, articles, interviews. It caused considerable controversy. His work proved popular enough that prominent theologians and historians addressed his arguments in several leading journals of religion. In response, Drews took part in a series of public debates, which often became emotionally charged.

Drews led a militant campaign for his book, supported by the National Association of Free Religion Societies, and The National Association of Monists. which organized a huge debate on Jan 31 and Feb 1, 1910 in the Berlin Zoological Garden between monists and liberal theologians including Baron von Soden of the Berlin University. Attended by 2,000 people, including the country's most eminent theologians, the meetings went on until three in the morning. The New York Times called it "one of the most remarkable theological discussions" since the days of Martin Luther, reporting that Drews's supporters caused a sensation by plastering the town's billboards with posters asking, Did Jesus Christ ever live? According to the newspaper his arguments were so graphic that several women had to be carried from the hall screaming hysterically, while one woman stood on a chair and invited God to strike him down.
On Feb 20, 1910, a counter confrontation took place in the Bush Circus. The following year, on March 12, 1911 another follow-up debate was organized. In 1912, S. J. Case noted that within the last decade, doubts about Jesus existence had been advanced in several quarters, but nowhere so insistently as in Germany where the skeptical movement had become a regular propaganda, "Its foremost champion is Arthur Drews, professor of philosophy in Karlsruhe Technical High School. Since the appearance of his Christusmythe in 1909 the subject has been kept before the public by means of debates held in various places, particularly at some important university centers such as Jena, Marburg, Giessen, Leipzig, Berlin."

United States
Drews's international popularity was confirmed by the New York Times'''s critical review of his Christ Myth book on March 26, 1911, "A German's Christ Myth: Prof. Arthur Drews Carries the Higher Criticism to the Point of Absurdity". The anonymous reviewer recites the current objections addressed to Drews's Christ Myth book. He lists the general criticisms addressed by theologians, denouncing ...the pseudo-scientific vagaries... in a style redolent of the professorial chair of a German pedant...[ Jesus's] characteristics...are derived from Jewish ideals floating in the air at the time...This mythical personage was transformed into a demigod by St. Paul...virtually the creator of Christianity. His main grounds for disbelief in the existence of Jesus are the absence of any contemporary references to him except in the Gospels – a rather large exception, one would think. Passages of Josephus, Tacitus and Pliny are explained away as being late, or interpolated, or applying to the myth rather than to the person...
Dr. Drews proceeds ruthlessly to remove even this kernel [of a gracious life, with its marked individuality left by liberal theologians] and leaves virtually nothing in its place except a mass of floating ideas and ideals...concentrated around a non-existent personality...
[Prof. Drews] denies the originality of the sayings attributed to Jesus, and considers them tainted with other-worldliness...[his book] is an argument in favor of...Monism...known as Pantheism...It is, however, just the sort of presentment which attracts the half-baked mind that cannot judge of historic evidence. [emphasis added]

 Russia
Drews's Christ Myth was to find an unpredictable reception in Russia, as his ideas reached the new Soviet Union leadership at the end of a very circuitous route – as a distant repercussion of the philosophy of Hegel and the reactions of his students, notably the relationship between Bruno Bauer and his young student, Karl Marx.

At the end of World War I, back on the social front, the Russian revolutionary Vladimir Lenin (1870–1924) had become the successor of Marx and Engels' socialism/communism, formulating his own Russian version of Marxism-Leninism of communism and atheism. Once the Bolsheviks gained power in the Soviet Union, Marxist–Leninist atheism became de facto the official doctrine of the state, under the leadership of Lenin, the Soviet leader from 1917 until his death.

Lenin was particularly receptive to the ideas of Bruno Bauer, a former friend and ally of Karl Marx when both were Young Hegelians. According to Zvi Rosen, in Bruno Bauer and Karl Marx (1977), Lenin was eager to use Bruno Bauer's attacks on Christianity as agitprop against the bourgeoisie, as updated by Arthur Drews. He accepted Drews's thesis that Jesus had never existed as anti-Christian propaganda.

Lenin argued that it was imperative in the struggle against religious obscurantists to adopt revolutionary ideas like those of Drews, and demolish the icons of bourgeois society.Edyth C. Haber, "The Mythic Bulgakov: 'The Master and Margarita' and Arthur Drews's 'The Christ Myth'", Slavic & East European Journal, volume 43, issue 2, 1999, p. 347. Several editions of Drews's The Christ Myth were published in the Soviet Union from the early 1920s onwards, and his arguments were included in school and university textbooks. Public meetings debating Did Christ live? were organized, during which party operatives debated with clergymen.

However, this acceptance of his ideas in Moscow and the Soviet Union did not save Drews, a believer, from Lenin's attacks, for being a "reactionary, openly helping the exploiters to replace old and rotten prejudices with new, still more disgusting and base prejudices".

At home, the diffusion of his book in the USSR had no impact on Drews's modest life as a teacher in Karlsruhe and were of no use to improving his social lot.

 Influence on Couchoud and G.A. Wells
In a different development to the West, Arthur Drews became influential on the formation of the "Jesus existence denial" theories of Paul-Louis Couchoud and G. A. Wells. Fluent in German, they had followed the huge academic controversy over the Christ Myth, and were able to read all of Drews's work in the original German. They both accepted and adapted Drews's main ideas. Drews had finally found some followers abroad, both in France and England. Wells, for instance, saw Jesus as a personification of Wisdom, which had appeared on earth in some indefinite time past. William B. Smith in the US, who also could read German fluently, remained a very close ally and a kindred soul.

In the same manner that Schweitzer is a seminal reference for historicists, Drews is a basic reference for the denial of Jesus historicity. Arthur Drews left his mark on practically the whole development of the Christ Myth thesis, (so-called "mythicism") which followed him.

 Professional theologians

In Christ Myth II (1912), Drews describes the cultural commotion: Now the whole Press is engaged against the disturber of the peace...Opposing lectures and Protestant meetings are organised, and J. Weiss publicly declares that the author of the book has no right to be taken seriously. But among his fellows, within the four walls of the lecture-hall, and in the printed version of his lectures, Weiss assures his readers that he has taken the matter 'very seriously', and speaks of the fateful hour through which our [theological] science is passing. [emphasis added]
Most significant theologian scholars immediately felt the need to take up the challenge and entered the debate sparked off by Drews's Christ Myth about the Historicity of Jesus. Most of the responses world-wide by theologians were violently negative and critical.

But Drews had some quality supporters, like the famous Orientalist Peter Jensen. Coincidentally, M. M. Mangasarian also published in 1909 The Truth About Jesus, Is He A Myth?. In 1912, William Benjamin Smith published Ecce Deus: Studies of Primitive Christianity, (with an introduction by Paul Wilhelm Schmiedel (1912).

Albert Schweitzer
To discuss Drews's thesis, Albert Schweitzer added two new chapters in the 1913 second edition of his Quest of the Historical Jesus. (Geschichte der Leben-Jesu-Forschung, 2. Auflage, 1913)

Ch. 22, (p. 451–499), "The New Denial of the Historicity of Jesus" (Die Neueste Bestreitung der Geschichtlichkeit Jesu) analyzes Drews's thesis, plus eight writers in support of Drews's thesis about the non-existence of Jesus: J. M. Robertson, Peter Jensen, Andrzej Niemojewski, Christian Paul Fuhrmann, W.B. Smith, Thomas Whittaker, G.J.P.J. Bolland, Samuel Lublinski. Three of them favor mythic-astral explanations.

Ch. 23 (p. 500–560), "The Debate About the Historicity of Jesus" (Die Diskussion über die Geschichtlichkeit Jesu), reviews the publications of 40 theologians/scholars in response to Drews, and mentions the participants in the Feb. 1910 public debate. Most of the publications are critical and negative. Schweitzer continues his systematic exposure of the problems and difficulties in the theories of the Bestreiter ("challengers') and Verneiner ("deniers") — the Dutch Radicals, J. M. Robertson, W. B. Smith and Drews – and the authenticity of Paul's epistles and Paul's historicity as well.

The Christ Myth theological debate, in 1909–1913 and 1914–1927, tabulated by Peter De Mey

Peter De Mey, a professor of Systematic Theology at the Catholic Un. of Leuven (Belgium), in a comprehensive paper "On Rereading the Christ Myth Theological Debate" (c. 2004), cited and tabulated refutations from academic theologians in Germany, Britain, the United States, and France. De Mey offers a list of 87 books and articles: 83 publications in 1909–1927 (62 in German, 19 in English, 2 in French), plus 4 isolated odd ones. A near-unanimity of the responses cited by De Mey are opposed to Drews's conclusions, with some variations.
 – 68 citations of publications in the 1909–1913 period (52 in German, 14 in English, 2 in French), until Schweitzer's 2d edition of The Quest (1913). The list includes established German authorities such as Wilhelm Bousset, Daniel Chwolson, Alfred Jeremias, Adolf Jülicher, Paul Wilhelm Schmiedel, Albert Schweitzer, Paul Tillich, Ernst Troeltsch, Hermann von Soden, and Johannes WeissOf the 40 theologians already listed by Schweitzer's Quest in his second edition, De Mey ignores nine scholars (as not being "fundamental" theologians) that Schweitzer had considered significant, including an important response by the famous Babylonian expert Peter Jensen.
 – 15 citations after the 2d edition of The Quest, in 1914–1927. Of those, 10 were in German, 5 in English.

 Refutations from 1912 to WW II
Shirley Jackson Case (1872–1947), The Historicity of Jesus: a Criticism of the Contention that Jesus Never Lived, a Statement of the Evidence for His Existence, an Estimate of His Relation to Christianity (1912) uses the Christ of Faith as the basis for his argumentation, maintaining the validity of the supernatural, miracles and resurrection. In the "world-view in which natural law" is "dominant" and "reason and human experience have been made fundamental" and replaced "supernatural revelation", the Gospels are no longer perceived in their authentic light – being "reinterpreted...or else dismissed as utterly unhistorical." (Ch. 1)

 Frederick Cornwallis Conybeare (1856–1924),  The historical Christ, or, An investigation of the views of Mr. J.M. Robertson, Dr. A. Drews, and Prof. W.B. Smith, (1914) reads the texts as showing a gradual deification of a man, pointing to an existing human source.
Maurice Goguel (1880–1955), Jesus The Nazarene, Myth Or History? (1926) suggests that Christianity started as a mystery cult, with a hero of a recent date, a Jewish faith-healer who came to believe he was the Messiah, and got executed by Pilate. Paul is a confusing patchwork of ideas and remains unexplained.
A.D. Howell Smith (b. 1880), Jesus Not A Myth (1942). Smith argues that the early Christian texts never call Jesus a God, and that the prediction that the Kingdom of God will happen during the lifetime of his listeners is a strong argument for the historicity of the preacher.
Archibald Robertson (1886–1961),  Jesus: Myth or History? (1946). Robertson's father (same name) was Principal of King's College, London and Bishop of Exeter. Robertson became a journalist/author. His book is an account of the public debate in the 1890–1940 period. It lists the key spokesmen, gives an analysis of their main arguments, and ends by seeking a compromise between both sides. Robertson pits two teams:
 – 11 "historicists": Frederick C. Conybeare, Thomas K. Cheyne, Paul W. Schmiedel, Alfred Loisy, Albert Schweitzer, Charles Guignebert, Rudolf Bultmann, Joseph Klausner, Robert Eisler, Maurice Goguel, A.D. Howell Smith;
 – against 8 "mythicists": Bruno Bauer, John M. Robertson, Thomas Whittaker, William B. Smith, Arthur Drews, Paul-Louis Couchoud, L. Gordon Rylands, Edouard Dujardin.

"Mythicism"
In their books, A.D. Howell Smith (1942) and Archibald Robertson (1946) popularized the use of mythicist (L19, i.e. late 19th century, "a student, interpreter, or creator of myths; also an adherent or student of mythicism), and mythicism (rare, M19, "attributing an origin in myth to narratives of supernatural events"; also "the tendency to create myths"). Both were adopted as a convenient shorthand for the "denial of Jesus existence", or the "thesis of non-historicity".

For Drews, Jesus historicity is the thesis, always affirmed and demonstrated first, while Jesus historicity denial was the antithesis in a Hegelian sense, always coming in second position, after the positive thesis. Same thing with Schweitzer, who, in the rebuttals in the 2d edition of the Quest (Ch. 22 & 23), only speaks of Bestreiter der Geschichtlikchkeit Jesu, or Verneiner i.e. challengers, or deniers of the historicity of Jesus. Jesus has to be phenomenologically defined, before his existence can be denied.

Theologians claim that mythicism is a positive assertion, with the historicist only putting up a defense against the mythicists. For instance, Hoffmann decries Ehrman's book as "entirely inadequate as a defense".

In fact, historicists exhibit vastly different constructions of the historical Jesus — to the point of creating a "mess". Schweitzer never attacks an abstract anonymous doctrine. As a historian, he always addresses the arguments of specific scholars and writers, from the platform of his own personal arguments, avoids weasel expressions and specifically "names names".

"Jesus Historicists" vs "Historicity Deniers"
World War II put a stop to the public debate initially set off by Arthur Drews, until George Albert Wells (b. 1926), a professor of German at Un. of London, reignited it in the 70s with a series of books directly influenced by his readings of Bruno Bauer, Kalthoff and Drews in their original German.

A whole series of scholars have re-opened the debate by publishing major refutations of Drews's Christ Myth thesis, including Ian Wilson (1984), R.T. France (1986), Morton Smith (1986), Graham N. Stanton (1989), Robert Van Voorst (2000), James Beilby and Paul R. Eddy (2009), R. Joseph Hoffmann (1986 and 2010).

Various conferences have been held in the US and Europe, notably by the Committee for the Scientific Examination of Religion (2007), and the Center for Inquiry CFI (2010), with scholars from both sides, such as Robert M. Price making contributions.

Major committees have been formed for communal examinations of the topics of historicity versus non-historicity, including:
The famous Jesus Seminar formed by Robert Funk in 1985 under the tutelage of the Westar Institute,
The Jesus Project (Dec. 2007-Oct. 2009), under the leadership of R. Joseph Hoffmann and Robert M. Price. Its goal was "to take the theory [of the non-existence of Jesus] as a 'testable hypothesis' and use the best methods of critical inquiry to reach a probable conclusion."
The Jesus Process, formed in May 2012 as another round of inquiry with a new cast.

With the spread of the Internet, the old theological controversy that was raging 100 years ago has percolated down to the public forum and known a recrudescence, with a "upsurge" of the non-existence thesis. Both academic and independent scholars have ridden the new boom with publications all aimed at discussing the Christ Myth thesis and its aftermath, including major works by Robert M. Price (August 2011), Bart D. Ehrman (March 2012), Richard Carrier (April 2012), Thomas L. Thompson and Thomas Verenna (July 2012), and Maurice Casey (August 2012).

R. Joseph Hoffmann
R. Joseph Hoffmann is a historian of Early Christianity. Educated by Catholic nuns, he has remained a sentimental defender of the Church, a vocal advocate of Jesus' historicity, and a standard-bearer in the campaign against Arthur Drews's non-historicity thesis. He participated in the Jesus Seminar and the aborted Jesus Project. Hoffmann also runs an Internet blog, the New Oxonian. Hoffmann is well known for his witty, highly erudite and often acerbic style, and his penchant for complicated and extreme declarations. In May 2012, Hoffmann presented the Jesus Process defined as yet another round on the popular theme of "Consultation on the Historical Jesus". An introductory manifesto for the new group has been outlined in "Controversy, Mythicism, and the Historical Jesus" of May 22, 2012.

When listing the major refutations of the Christ Myth thesis (Note [3]), Hoffmann notes that the "important studies" are the five works by S. J. Case, F. C. Conybeare, Maurice Goguel, R. T. France, and Morton Smith. Hoffmann omits from that list many historically significant refutations such as Albert Schweitzer's critique of the Christ Myth in the added chapters 22 & 23 of the second edition of the Quest (1913, translated in 2001), or Robert Van Voorst's work.

Hoffmann has systematically used the New Oxonian for striking rhetorical blows at Drews's non-historical thesis. He does not hesitate to impute to Drews "a kind of proto-Nazi paganism".
[M]yth-theorists have normally held that the gospel writers... wrote fraudulent or consciously deceptive tales... The elimination of James as a "prop" for the historical Jesus has been a priority of the myth theorizers...[an] insupportable contention...[Drews is] [f]amous for his academic inexactness and sensationalism...with the glaring mistake...Despite the energy of the myth school...It remains a quaint, curious, interesting but finally unimpressive assessment of the evidence... an agenda-driven "waste of time"... a quicksand of denial and half-cooked conspiracy theories that take skepticism and suspicion to a new low. Like all failed hypotheses, it arrives at its premise by intuition, cherry picks its evidence... defends its "conclusions" by force majeure... a dogma in search of footnotes... its most ardent supporters... have been amateurs or dabblers in New Testament studies... least equipped by training or inclination ...[The Christ Myth is] manically disorientated, [arguing] a kind of proto-Nazi paganism... Drews is significant largely because he created the flashpoints to which many mythicists return again and again...[Emphasis added]

Hoffmann has declared that the non-historicity thesis should no longer be ignored, but must be confronted head-on: "I have often made the claim that it has been largely theological interests since Strauss's time that ruled the historicity question out of court." [Emphasis added.].

Hoffmann has mentioned that Bart D. Ehrman's book, Did Jesus Exist?, is "exceptionally disappointing and not an adequate rejoinder to the routinely absurd ideas of the Jesus-deniers.  For that reason... I have had to abandon my indifference and get back into the fight—on the side of the son of man.". Hoffmann has announced a major book, intended to become the master refutation of the Christ Myth thesis, in order to block the increase of its popularity, and to safeguard the integrity of New Testament studies (New Oxonian'', May 22, 2012)
This essay is in part an attempt to clarify procedural issues relevant to what is sometimes called the "Christ-myth" or "Non-historicity" thesis—an argumentative approach to the New Testament based on the theory that the historical Jesus of Nazareth did not exist...The failure of scholars to take the "question of Jesus" seriously has resulted in a slight increase in the popularity of the non-historicity thesis, a popularity that—in my view—now threatens to distract biblical studies from the serious business of illuminating the causes, context and development of early Christianity...It is a preface of sorts to a more ambitious project on the myth theory itself and what we can reliably know–if anything—about the historical Jesus. [Emphasis added]

References

External links

1909 non-fiction books
Works about the Christ myth theory
Books about Jesus
Phoenician mythology
Ancient Near East


text:
using namespace llvm;

static codegen::RegisterCodeGenFlags CGF;

#define DEBUG_TYPE "lli"

namespace {

  enum class JITKind { MCJIT, OrcMCJITReplacement, OrcLazy };

  cl::opt<std::string>
  InputFile(cl::desc("<input bitcode>"), cl::Positional, cl::init("-"));

  cl::list<std::string>
  InputArgv(cl::ConsumeAfter, cl::desc("<program arguments>..."));

  cl::opt<bool> ForceInterpreter("force-interpreter",
                                 cl::desc("Force interpretation: disable JIT"),
                                 cl::init(false));

  cl::opt<JITKind> UseJITKind(
      "jit-kind", cl::desc("Choose underlying JIT kind."),
      cl::init(JITKind::MCJIT),
      cl::values(clEnumValN(JITKind::MCJIT, "mcjit", "MCJIT"),
                 clEnumValN(JITKind::OrcMCJITReplacement, "orc-mcjit",
                            "Orc-based MCJIT replacement "
                            "(deprecated)"),
                 clEnumValN(JITKind::OrcLazy, "orc-lazy",
                            "Orc-based lazy JIT.")));

  cl::opt<unsigned>
  LazyJITCompileThreads("compile-threads",
                        cl::desc("Choose the number of compile threads "
                                 "(jit-kind=orc-lazy only)"),
                        cl::init(0));

  cl::list<std::string>
  ThreadEntryPoints("thread-entry",
                    cl::desc("calls the given entry-point on a new thread "
                             "(jit-kind=orc-lazy only)"));

  cl::opt<bool> PerModuleLazy(
      "per-module-lazy",
      cl::desc("Performs lazy compilation on whole module boundaries "
               "rather than individual functions"),
      cl::init(false));

  cl::list<std::string>
      JITDylibs("jd",
                cl::desc("Specifies the JITDylib to be used for any subsequent "
                         "-extra-module arguments."));

  cl::list<std::string>
    Dylibs("dlopen", cl::desc("Dynamic libraries to load before linking"),
           cl::ZeroOrMore);

  // The MCJIT supports building for a target address space separate from
  // the JIT compilation process. Use a forked process and a copying
  // memory manager with IPC to execute using this functionality.
  cl::opt<bool> RemoteMCJIT("remote-mcjit",
    cl::desc("Execute MCJIT'ed code in a separate process."),
    cl::init(false));

  // Manually specify the child process for remote execution. This overrides
  // the simulated remote execution that allocates address space for child
  // execution. The child process will be executed and will communicate with
  // lli via stdin/stdout pipes.
  cl::opt<std::string>
  ChildExecPath("mcjit-remote-process",
                cl::desc("Specify the filename of the process to launch "
                         "for remote MCJIT execution.  If none is specified,"
                         "\n\tremote execution will be simulated in-process."),
                cl::value_desc("filename"), cl::init(""));

  // Determine optimization level.
  cl::opt<char>
  OptLevel("O",
           cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
                    "(default = '-O2')"),
           cl::Prefix,
           cl::ZeroOrMore,
           cl::init(' '));

  cl::opt<std::string>
  TargetTriple("mtriple", cl::desc("Override target triple for module"));

  cl::opt<std::string>
  EntryFunc("entry-function",
            cl::desc("Specify the entry function (default = 'main') "
                     "of the executable"),
            cl::value_desc("function"),
            cl::init("main"));

  cl::list<std::string>
  ExtraModules("extra-module",
         cl::desc("Extra modules to be loaded"),
         cl::value_desc("input bitcode"));

  cl::list<std::string>
  ExtraObjects("extra-object",
         cl::desc("Extra object files to be loaded"),
         cl::value_desc("input object"));

  cl::list<std::string>
  ExtraArchives("extra-archive",
         cl::desc("Extra archive files to be loaded"),
         cl::value_desc("input archive"));

  cl::opt<bool>
  EnableCacheManager("enable-cache-manager",
        cl::desc("Use cache manager to save/load modules"),
        cl::init(false));

  cl::opt<std::string>
  ObjectCacheDir("object-cache-dir",
                  cl::desc("Directory to store cached object files "
                           "(must be user writable)"),
                  cl::init(""));

  cl::opt<std::string>
  FakeArgv0("fake-argv0",
            cl::desc("Override the 'argv[0]' value passed into the executing"
                     " program"), cl::value_desc("executable"));

  cl::opt<bool>
  DisableCoreFiles("disable-core-files", cl::Hidden,
                   cl::desc("Disable emission of core files if possible"));

  cl::opt<bool>
  NoLazyCompilation("disable-lazy-compilation",
                  cl::desc("Disable JIT lazy compilation"),
                  cl::init(false));

  cl::opt<bool>
  GenerateSoftFloatCalls("soft-float",
    cl::desc("Generate software floating point library calls"),
    cl::init(false));

  cl::opt<bool> NoProcessSymbols(
      "no-process-syms",
      cl::desc("Do not resolve lli process symbols in JIT'd code"),
      cl::init(false));

  enum class LLJITPlatform { DetectHost, GenericIR, MachO };

  cl::opt<LLJITPlatform>
      Platform("lljit-platform", cl::desc("Platform to use with LLJIT"),
               cl::init(LLJITPlatform::DetectHost),
               cl::values(clEnumValN(LLJITPlatform::DetectHost, "DetectHost",
                                     "Select based on JIT target triple"),
                          clEnumValN(LLJITPlatform::GenericIR, "GenericIR",
                                     "Use LLJITGenericIRPlatform"),
                          clEnumValN(LLJITPlatform::MachO, "MachO",
                                     "Use LLJITMachOPlatform")),
               cl::Hidden);

  enum class DumpKind {
    NoDump,
    DumpFuncsToStdOut,
    DumpModsToStdOut,
    DumpModsToDisk
  };

  cl::opt<DumpKind> OrcDumpKind(
      "orc-lazy-debug", cl::desc("Debug dumping for the orc-lazy JIT."),
      cl::init(DumpKind::NoDump),
      cl::values(clEnumValN(DumpKind::NoDump, "no-dump",
                            "Don't dump anything."),
                 clEnumValN(DumpKind::DumpFuncsToStdOut, "funcs-to-stdout",
                            "Dump function names to stdout."),
                 clEnumValN(DumpKind::DumpModsToStdOut, "mods-to-stdout",
                            "Dump modules to stdout."),
                 clEnumValN(DumpKind::DumpModsToDisk, "mods-to-disk",
                            "Dump modules to the current "
                            "working directory. (WARNING: "
                            "will overwrite existing files).")),
      cl::Hidden);

  ExitOnError ExitOnErr;
}

//===----------------------------------------------------------------------===//
// Object cache
//
// This object cache implementation writes cached objects to disk to the
// directory specified by CacheDir, using a filename provided in the module
// descriptor. The cache tries to load a saved object using that path if the
// file exists. CacheDir defaults to "", in which case objects are cached
// alongside their originating bitcodes.
//
class LLIObjectCache : public ObjectCache {
public:
  LLIObjectCache(const std::string& CacheDir) : CacheDir(CacheDir) {
    // Add trailing '/' to cache dir if necessary.
    if (!this->CacheDir.empty() &&
        this->CacheDir[this->CacheDir.size() - 1] != '/')
      this->CacheDir += '/';
  }
  ~LLIObjectCache() override {}

  void notifyObjectCompiled(const Module *M, MemoryBufferRef Obj) override {
    const std::string &ModuleID = M->getModuleIdentifier();
    std::string CacheName;
    if (!getCacheFilename(ModuleID, CacheName))
      return;
    if (!CacheDir.empty()) { // Create user-defined cache dir.
      SmallString<128> dir(sys::path::parent_path(CacheName));
      sys::fs::create_directories(Twine(dir));
    }

    std::error_code EC;
    raw_fd_ostream outfile(CacheName, EC, sys::fs::OF_None);
    outfile.write(Obj.getBufferStart(), Obj.getBufferSize());
    outfile.close();
  }

  std::unique_ptr<MemoryBuffer> getObject(const Module* M) override {
    const std::string &ModuleID = M->getModuleIdentifier();
    std::string CacheName;
    if (!getCacheFilename(ModuleID, CacheName))
      return nullptr;
    // Load the object from the cache filename
    ErrorOr<std::unique_ptr<MemoryBuffer>> IRObjectBuffer =
        MemoryBuffer::getFile(CacheName, -1, false);
    // If the file isn't there, that's OK.
    if (!IRObjectBuffer)
      return nullptr;
    // MCJIT will want to write into this buffer, and we don't want that
    // because the file has probably just been mmapped.  Instead we make
    // a copy.  The filed-based buffer will be released when it goes
    // out of scope.
    return MemoryBuffer::getMemBufferCopy(IRObjectBuffer.get()->getBuffer());
  }

private:
  std::string CacheDir;

  bool getCacheFilename(const std::string &ModID, std::string &CacheName) {
    std::string Prefix("file:");
    size_t PrefixLength = Prefix.length();
    if (ModID.substr(0, PrefixLength) != Prefix)
      return false;

    std::string CacheSubdir = ModID.substr(PrefixLength);
#if defined(_WIN32)
    // Transform "X:\foo" => "/X\foo" for convenience.
    if (isalpha(CacheSubdir[0]) && CacheSubdir[1] == ':') {
      CacheSubdir[1] = CacheSubdir[0];
      CacheSubdir[0] = '/';
    }
#endif

    CacheName = CacheDir + CacheSubdir;
    size_t pos = CacheName.rfind('.');
    CacheName.replace(pos, CacheName.length() - pos, ".o");
    return true;
  }
};

// On Mingw and Cygwin, an external symbol named '__main' is called from the
// generated 'main' function to allow static initialization.  To avoid linking
// problems with remote targets (because lli's remote target support does not
// currently handle external linking) we add a secondary module which defines
// an empty '__main' function.
static void addCygMingExtraModule(ExecutionEngine &EE, LLVMContext &Context,
                                  StringRef TargetTripleStr) {
  IRBuilder<> Builder(Context);
  Triple TargetTriple(TargetTripleStr);

  // Create a new module.
  std::unique_ptr<Module> M = std::make_unique<Module>("CygMingHelper", Context);
  M->setTargetTriple(TargetTripleStr);

  // Create an empty function named "__main".
  Type *ReturnTy;
  if (TargetTriple.isArch64Bit())
    ReturnTy = Type::getInt64Ty(Context);
  else
    ReturnTy = Type::getInt32Ty(Context);
  Function *Result =
      Function::Create(FunctionType::get(ReturnTy, {}, false),
                       GlobalValue::ExternalLinkage, "__main", M.get());

  BasicBlock *BB = BasicBlock::Create(Context, "__main", Result);
  Builder.SetInsertPoint(BB);
  Value *ReturnVal = ConstantInt::get(ReturnTy, 0);
  Builder.CreateRet(ReturnVal);

  // Add this new module to the ExecutionEngine.
  EE.addModule(std::move(M));
}

CodeGenOpt::Level getOptLevel() {
  switch (OptLevel) {
  default:
    WithColor::error(errs(), "lli") << "invalid optimization level.\n";
    exit(1);
  case '0': return CodeGenOpt::None;
  case '1': return CodeGenOpt::Less;
  case ' ':
  case '2': return CodeGenOpt::Default;
  case '3': return CodeGenOpt::Aggressive;
  }
  llvm_unreachable("Unrecognized opt level.");
}

LLVM_ATTRIBUTE_NORETURN
static void reportError(SMDiagnostic Err, const char *ProgName) {
  Err.print(ProgName, errs());
  exit(1);
}

Error loadDylibs();
int runOrcLazyJIT(const char *ProgName);
void disallowOrcOptions();

//===----------------------------------------------------------------------===//
// main Driver function
//
int main(int argc, char **argv, char * const *envp) {
  InitLLVM X(argc, argv);

  if (argc > 1)
    ExitOnErr.setBanner(std::string(argv[0]) + ": ");

  // If we have a native target, initialize it to ensure it is linked in and
  // usable by the JIT.
  InitializeNativeTarget();
  InitializeNativeTargetAsmPrinter();
  InitializeNativeTargetAsmParser();

  cl::ParseCommandLineOptions(argc, argv,
                              "llvm interpreter & dynamic compiler\n");

  // If the user doesn't want core files, disable them.
  if (DisableCoreFiles)
    sys::Process::PreventCoreFiles();

  ExitOnErr(loadDylibs());

  if (UseJITKind == JITKind::OrcLazy)
    return runOrcLazyJIT(argv[0]);
  else
    disallowOrcOptions();

  LLVMContext Context;

  // Load the bitcode...
  SMDiagnostic Err;
  std::unique_ptr<Module> Owner = parseIRFile(InputFile, Err, Context);
  Module *Mod = Owner.get();
  if (!Mod)
    reportError(Err, argv[0]);

  if (EnableCacheManager) {
    std::string CacheName("file:");
    CacheName.append(InputFile);
    Mod->setModuleIdentifier(CacheName);
  }

  // If not jitting lazily, load the whole bitcode file eagerly too.
  if (NoLazyCompilation) {
    // Use *argv instead of argv[0] to work around a wrong GCC warning.
    ExitOnError ExitOnErr(std::string(*argv) +
                          ": bitcode didn't read correctly: ");
    ExitOnErr(Mod->materializeAll());
  }

  std::string ErrorMsg;
  EngineBuilder builder(std::move(Owner));
  builder.setMArch(codegen::getMArch());
  builder.setMCPU(codegen::getCPUStr());
  builder.setMAttrs(codegen::getFeatureList());
  if (auto RM = codegen::getExplicitRelocModel())
    builder.setRelocationModel(RM.getValue());
  if (auto CM = codegen::getExplicitCodeModel())
    builder.setCodeModel(CM.getValue());
  builder.setErrorStr(&ErrorMsg);
  builder.setEngineKind(ForceInterpreter
                        ? EngineKind::Interpreter
                        : EngineKind::JIT);
  builder.setUseOrcMCJITReplacement(AcknowledgeORCv1Deprecation,
                                    UseJITKind == JITKind::OrcMCJITReplacement);

  // If we are supposed to override the target triple, do so now.
  if (!TargetTriple.empty())
    Mod->setTargetTriple(Triple::normalize(TargetTriple));

  // Enable MCJIT if desired.
  RTDyldMemoryManager *RTDyldMM = nullptr;
  if (!ForceInterpreter) {
    if (RemoteMCJIT)
      RTDyldMM = new ForwardingMemoryManager();
    else
      RTDyldMM = new SectionMemoryManager();

    // Deliberately construct a temp std::unique_ptr to pass in. Do not null out
    // RTDyldMM: We still use it below, even though we don't own it.
    builder.setMCJITMemoryManager(
      std::unique_ptr<RTDyldMemoryManager>(RTDyldMM));
  } else if (RemoteMCJIT) {
    WithColor::error(errs(), argv[0])
        << "remote process execution does not work with the interpreter.\n";
    exit(1);
  }

  builder.setOptLevel(getOptLevel());

  TargetOptions Options = codegen::InitTargetOptionsFromCodeGenFlags();
  if (codegen::getFloatABIForCalls() != FloatABI::Default)
    Options.FloatABIType = codegen::getFloatABIForCalls();

  builder.setTargetOptions(Options);

  std::unique_ptr<ExecutionEngine> EE(builder.create());
  if (!EE) {
    if (!ErrorMsg.empty())
      WithColor::error(errs(), argv[0])
          << "error creating EE: " << ErrorMsg << "\n";
    else
      WithColor::error(errs(), argv[0]) << "unknown error creating EE!\n";
    exit(1);
  }

  std::unique_ptr<LLIObjectCache> CacheManager;
  if (EnableCacheManager) {
    CacheManager.reset(new LLIObjectCache(ObjectCacheDir));
    EE->setObjectCache(CacheManager.get());
  }

  // Load any additional modules specified on the command line.
  for (unsigned i = 0, e = ExtraModules.size(); i != e; ++i) {
    std::unique_ptr<Module> XMod = parseIRFile(ExtraModules[i], Err, Context);
    if (!XMod)
      reportError(Err, argv[0]);
    if (EnableCacheManager) {
      std::string CacheName("file:");
      CacheName.append(ExtraModules[i]);
      XMod->setModuleIdentifier(CacheName);
    }
    EE->addModule(std::move(XMod));
  }

  for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) {
    Expected<object::OwningBinary<object::ObjectFile>> Obj =
        object::ObjectFile::createObjectFile(ExtraObjects[i]);
    if (!Obj) {
      // TODO: Actually report errors helpfully.
      consumeError(Obj.takeError());
      reportError(Err, argv[0]);
    }
    object::OwningBinary<object::ObjectFile> &O = Obj.get();
    EE->addObjectFile(std::move(O));
  }

  for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) {
    ErrorOr<std::unique_ptr<MemoryBuffer>> ArBufOrErr =
        MemoryBuffer::getFileOrSTDIN(ExtraArchives[i]);
    if (!ArBufOrErr)
      reportError(Err, argv[0]);
    std::unique_ptr<MemoryBuffer> &ArBuf = ArBufOrErr.get();

    Expected<std::unique_ptr<object::Archive>> ArOrErr =
        object::Archive::create(ArBuf->getMemBufferRef());
    if (!ArOrErr) {
      std::string Buf;
      raw_string_ostream OS(Buf);
      logAllUnhandledErrors(ArOrErr.takeError(), OS);
      OS.flush();
      errs() << Buf;
      exit(1);
    }
    std::unique_ptr<object::Archive> &Ar = ArOrErr.get();

    object::OwningBinary<object::Archive> OB(std::move(Ar), std::move(ArBuf));

    EE->addArchive(std::move(OB));
  }

  // If the target is Cygwin/MingW and we are generating remote code, we
  // need an extra module to help out with linking.
  if (RemoteMCJIT && Triple(Mod->getTargetTriple()).isOSCygMing()) {
    addCygMingExtraModule(*EE, Context, Mod->getTargetTriple());
  }

  // The following functions have no effect if their respective profiling
  // support wasn't enabled in the build configuration.
  EE->RegisterJITEventListener(
                JITEventListener::createOProfileJITEventListener());
  EE->RegisterJITEventListener(
                JITEventListener::createIntelJITEventListener());
  if (!RemoteMCJIT)
    EE->RegisterJITEventListener(
                JITEventListener::createPerfJITEventListener());

  if (!NoLazyCompilation && RemoteMCJIT) {
    WithColor::warning(errs(), argv[0])
        << "remote mcjit does not support lazy compilation\n";
    NoLazyCompilation = true;
  }
  EE->DisableLazyCompilation(NoLazyCompilation);

  // If the user specifically requested an argv[0] to pass into the program,
  // do it now.
  if (!FakeArgv0.empty()) {
    InputFile = static_cast<std::string>(FakeArgv0);
  } else {
    // Otherwise, if there is a .bc suffix on the executable strip it off, it
    // might confuse the program.
    if (StringRef(InputFile).endswith(".bc"))
      InputFile.erase(InputFile.length() - 3);
  }

  // Add the module's name to the start of the vector of arguments to main().
  InputArgv.insert(InputArgv.begin(), InputFile);

  // Call the main function from M as if its signature were:
  //   int main (int argc, char **argv, const char **envp)
  // using the contents of Args to determine argc & argv, and the contents of
  // EnvVars to determine envp.
  //
  Function *EntryFn = Mod->getFunction(EntryFunc);
  if (!EntryFn) {
    WithColor::error(errs(), argv[0])
        << '\'' << EntryFunc << "\' function not found in module.\n";
    return -1;
  }

  // Reset errno to zero on entry to main.
  errno = 0;

  int Result = -1;

  // Sanity check use of remote-jit: LLI currently only supports use of the
  // remote JIT on Unix platforms.
  if (RemoteMCJIT) {
#ifndef LLVM_ON_UNIX
    WithColor::warning(errs(), argv[0])
        << "host does not support external remote targets.\n";
    WithColor::note() << "defaulting to local execution\n";
    return -1;
#else
    if (ChildExecPath.empty()) {
      WithColor::error(errs(), argv[0])
          << "-remote-mcjit requires -mcjit-remote-process.\n";
      exit(1);
    } else if (!sys::fs::can_execute(ChildExecPath)) {
      WithColor::error(errs(), argv[0])
          << "unable to find usable child executable: '" << ChildExecPath
          << "'\n";
      return -1;
    }
#endif
  }

  if (!RemoteMCJIT) {
    // If the program doesn't explicitly call exit, we will need the Exit
    // function later on to make an explicit call, so get the function now.
    FunctionCallee Exit = Mod->getOrInsertFunction(
        "exit", Type::getVoidTy(Context), Type::getInt32Ty(Context));

    // Run static constructors.
    if (!ForceInterpreter) {
      // Give MCJIT a chance to apply relocations and set page permissions.
      EE->finalizeObject();
    }
    EE->runStaticConstructorsDestructors(false);

    // Trigger compilation separately so code regions that need to be
    // invalidated will be known.
    (void)EE->getPointerToFunction(EntryFn);
    // Clear instruction cache before code will be executed.
    if (RTDyldMM)
      static_cast<SectionMemoryManager*>(RTDyldMM)->invalidateInstructionCache();

    // Run main.
    Result = EE->runFunctionAsMain(EntryFn, InputArgv, envp);

    // Run static destructors.
    EE->runStaticConstructorsDestructors(true);

    // If the program didn't call exit explicitly, we should call it now.
    // This ensures that any atexit handlers get called correctly.
    if (Function *ExitF =
            dyn_cast<Function>(Exit.getCallee()->stripPointerCasts())) {
      if (ExitF->getFunctionType() == Exit.getFunctionType()) {
        std::vector<GenericValue> Args;
        GenericValue ResultGV;
        ResultGV.IntVal = APInt(32, Result);
        Args.push_back(ResultGV);
        EE->runFunction(ExitF, Args);
        WithColor::error(errs(), argv[0])
            << "exit(" << Result << ") returned!\n";
        abort();
      }
    }
    WithColor::error(errs(), argv[0]) << "exit defined with wrong prototype!\n";
    abort();
  } else {
    // else == "if (RemoteMCJIT)"

    // Remote target MCJIT doesn't (yet) support static constructors. No reason
    // it couldn't. This is a limitation of the LLI implementation, not the
    // MCJIT itself. FIXME.

    // Lanch the remote process and get a channel to it.
    std::unique_ptr<FDRawChannel> C = launchRemote();
    if (!C) {
      WithColor::error(errs(), argv[0]) << "failed to launch remote JIT.\n";
      exit(1);
    }

    // Create a remote target client running over the channel.
    llvm::orc::ExecutionSession ES;
    ES.setErrorReporter([&](Error Err) { ExitOnErr(std::move(Err)); });
    typedef orc::remote::OrcRemoteTargetClient MyRemote;
    auto R = ExitOnErr(MyRemote::Create(*C, ES));

    // Create a remote memory manager.
    auto RemoteMM = ExitOnErr(R->createRemoteMemoryManager());

    // Forward MCJIT's memory manager calls to the remote memory manager.
    static_cast<ForwardingMemoryManager*>(RTDyldMM)->setMemMgr(
      std::move(RemoteMM));

    // Forward MCJIT's symbol resolution calls to the remote.
    static_cast<ForwardingMemoryManager *>(RTDyldMM)->setResolver(
        orc::createLambdaResolver(
            AcknowledgeORCv1Deprecation,
            [](const std::string &Name) { return nullptr; },
            [&](const std::string &Name) {
              if (auto Addr = ExitOnErr(R->getSymbolAddress(Name)))
                return JITSymbol(Addr, JITSymbolFlags::Exported);
              return JITSymbol(nullptr);
            }));

    // Grab the target address of the JIT'd main function on the remote and call
    // it.
    // FIXME: argv and envp handling.
    JITTargetAddress Entry = EE->getFunctionAddress(EntryFn->getName().str());
    EE->finalizeObject();
    LLVM_DEBUG(dbgs() << "Executing '" << EntryFn->getName() << "' at 0x"
                      << format("%llx", Entry) << "\n");
    Result = ExitOnErr(R->callIntVoid(Entry));

    // Like static constructors, the remote target MCJIT support doesn't handle
    // this yet. It could. FIXME.

    // Delete the EE - we need to tear it down *before* we terminate the session
    // with the remote, otherwise it'll crash when it tries to release resources
    // on a remote that has already been disconnected.
    EE.reset();

    // Signal the remote target that we're done JITing.
    ExitOnErr(R->terminateSession());
  }

  return Result;
}

static std::function<void(Module &)> createDebugDumper() {
  switch (OrcDumpKind) {
  case DumpKind::NoDump:
    return [](Module &M) {};

  case DumpKind::DumpFuncsToStdOut:
    return [](Module &M) {
      printf("[ ");

      for (const auto &F : M) {
        if (F.isDeclaration())
          continue;

        if (F.hasName()) {
          std::string Name(std::string(F.getName()));
          printf("%s ", Name.c_str());
        } else
          printf("<anon> ");
      }

      printf("]\n");
    };

  case DumpKind::DumpModsToStdOut:
    return [](Module &M) {
      outs() << "----- Module Start -----\n" << M << "----- Module End -----\n";
    };

  case DumpKind::DumpModsToDisk:
    return [](Module &M) {
      std::error_code EC;
      raw_fd_ostream Out(M.getModuleIdentifier() + ".ll", EC, sys::fs::OF_Text);
      if (EC) {
        errs() << "Couldn't open " << M.getModuleIdentifier()
               << " for dumping.\nError:" << EC.message() << "\n";
        exit(1);
      }
      Out << M;
    };
  }
  llvm_unreachable("Unknown DumpKind");
}

Error loadDylibs() {
  for (const auto &Dylib : Dylibs) {
    std::string ErrMsg;
    if (sys::DynamicLibrary::LoadLibraryPermanently(Dylib.c_str(), &ErrMsg))
      return make_error<StringError>(ErrMsg, inconvertibleErrorCode());
  }

  return Error::success();
}

static void exitOnLazyCallThroughFailure() { exit(1); }

Expected<orc::ThreadSafeModule>
loadModule(StringRef Path, orc::ThreadSafeContext TSCtx) {
  SMDiagnostic Err;
  auto M = parseIRFile(Path, Err, *TSCtx.getContext());
  if (!M) {
    std::string ErrMsg;
    {
      raw_string_ostream ErrMsgStream(ErrMsg);
      Err.print("lli", ErrMsgStream);
    }
    return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
  }

  if (EnableCacheManager)
    M->setModuleIdentifier("file:" + M->getModuleIdentifier());

  return orc::ThreadSafeModule(std::move(M), std::move(TSCtx));
}

int runOrcLazyJIT(const char *ProgName) {
  // Start setting up the JIT environment.

  // Parse the main module.
  orc::ThreadSafeContext TSCtx(std::make_unique<LLVMContext>());
  auto MainModule = ExitOnErr(loadModule(InputFile, TSCtx));

  // Get TargetTriple and DataLayout from the main module if they're explicitly
  // set.
  Optional<Triple> TT;
  Optional<DataLayout> DL;
  MainModule.withModuleDo([&](Module &M) {
      if (!M.getTargetTriple().empty())
        TT = Triple(M.getTargetTriple());
      if (!M.getDataLayout().isDefault())
        DL = M.getDataLayout();
    });

  orc::LLLazyJITBuilder Builder;

  Builder.setJITTargetMachineBuilder(
      TT ? orc::JITTargetMachineBuilder(*TT)
         : ExitOnErr(orc::JITTargetMachineBuilder::detectHost()));

  TT = Builder.getJITTargetMachineBuilder()->getTargetTriple();
  if (DL)
    Builder.setDataLayout(DL);

  if (!codegen::getMArch().empty())
    Builder.getJITTargetMachineBuilder()->getTargetTriple().setArchName(
        codegen::getMArch());

  Builder.getJITTargetMachineBuilder()
      ->setCPU(codegen::getCPUStr())
      .addFeatures(codegen::getFeatureList())
      .setRelocationModel(codegen::getExplicitRelocModel())
      .setCodeModel(codegen::getExplicitCodeModel());

  Builder.setLazyCompileFailureAddr(
      pointerToJITTargetAddress(exitOnLazyCallThroughFailure));
  Builder.setNumCompileThreads(LazyJITCompileThreads);

  // If the object cache is enabled then set a custom compile function
  // creator to use the cache.
  std::unique_ptr<LLIObjectCache> CacheManager;
  if (EnableCacheManager) {

    CacheManager = std::make_unique<LLIObjectCache>(ObjectCacheDir);

    Builder.setCompileFunctionCreator(
      [&](orc::JITTargetMachineBuilder JTMB)
            -> Expected<std::unique_ptr<orc::IRCompileLayer::IRCompiler>> {
        if (LazyJITCompileThreads > 0)
          return std::make_unique<orc::ConcurrentIRCompiler>(std::move(JTMB),
                                                        CacheManager.get());

        auto TM = JTMB.createTargetMachine();
        if (!TM)
          return TM.takeError();

        return std::make_unique<orc::TMOwningSimpleCompiler>(std::move(*TM),
                                                        CacheManager.get());
      });
  }

  // Set up LLJIT platform.
  {
    LLJITPlatform P = Platform;
    if (P == LLJITPlatform::DetectHost) {
      if (TT->isOSBinFormatMachO())
        P = LLJITPlatform::MachO;
      else
        P = LLJITPlatform::GenericIR;
    }

    switch (P) {
    case LLJITPlatform::GenericIR:
      // Nothing to do: LLJITBuilder will use this by default.
      break;
    case LLJITPlatform::MachO:
      Builder.setPlatformSetUp(orc::setUpMachOPlatform);
      ExitOnErr(orc::enableObjCRegistration("libobjc.dylib"));
      break;
    default:
      llvm_unreachable("Unrecognized platform value");
    }
  }

  auto J = ExitOnErr(Builder.create());

  if (TT->isOSBinFormatELF())
    static_cast<llvm::orc::RTDyldObjectLinkingLayer &>(J->getObjLinkingLayer())
        .registerJITEventListener(
            *JITEventListener::createGDBRegistrationListener());

  if (PerModuleLazy)
    J->setPartitionFunction(orc::CompileOnDemandLayer::compileWholeModule);

  auto Dump = createDebugDumper();

  J->getIRTransformLayer().setTransform(
      [&](orc::ThreadSafeModule TSM,
          const orc::MaterializationResponsibility &R) {
        TSM.withModuleDo([&](Module &M) {
          if (verifyModule(M, &dbgs())) {
            dbgs() << "Bad module: " << &M << "\n";
            exit(1);
          }
          Dump(M);
        });
        return TSM;
      });

  orc::MangleAndInterner Mangle(J->getExecutionSession(), J->getDataLayout());

  // Unless they've been explicitly disabled, make process symbols available to
  // JIT'd code.
  if (!NoProcessSymbols)
    J->getMainJITDylib().addGenerator(
        ExitOnErr(orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(
            J->getDataLayout().getGlobalPrefix(),
            [MainName = Mangle("main")](const orc::SymbolStringPtr &Name) {
              return Name != MainName;
            })));

  // Add the main module.
  ExitOnErr(J->addLazyIRModule(std::move(MainModule)));

  // Create JITDylibs and add any extra modules.
  {
    // Create JITDylibs, keep a map from argument index to dylib. We will use
    // -extra-module argument indexes to determine what dylib to use for each
    // -extra-module.
    std::map<unsigned, orc::JITDylib *> IdxToDylib;
    IdxToDylib[0] = &J->getMainJITDylib();
    for (auto JDItr = JITDylibs.begin(), JDEnd = JITDylibs.end();
         JDItr != JDEnd; ++JDItr) {
      orc::JITDylib *JD = J->getJITDylibByName(*JDItr);
      if (!JD) {
        JD = &ExitOnErr(J->createJITDylib(*JDItr));
        J->getMainJITDylib().addToLinkOrder(*JD);
        JD->addToLinkOrder(J->getMainJITDylib());
      }
      IdxToDylib[JITDylibs.getPosition(JDItr - JITDylibs.begin())] = JD;
    }

    for (auto EMItr = ExtraModules.begin(), EMEnd = ExtraModules.end();
         EMItr != EMEnd; ++EMItr) {
      auto M = ExitOnErr(loadModule(*EMItr, TSCtx));

      auto EMIdx = ExtraModules.getPosition(EMItr - ExtraModules.begin());
      assert(EMIdx != 0 && "ExtraModule should have index > 0");
      auto JDItr = std::prev(IdxToDylib.lower_bound(EMIdx));
      auto &JD = *JDItr->second;
      ExitOnErr(J->addLazyIRModule(JD, std::move(M)));
    }

    for (auto EAItr = ExtraArchives.begin(), EAEnd = ExtraArchives.end();
         EAItr != EAEnd; ++EAItr) {
      auto EAIdx = ExtraArchives.getPosition(EAItr - ExtraArchives.begin());
      assert(EAIdx != 0 && "ExtraArchive should have index > 0");
      auto JDItr = std::prev(IdxToDylib.lower_bound(EAIdx));
      auto &JD = *JDItr->second;
      JD.addGenerator(ExitOnErr(orc::StaticLibraryDefinitionGenerator::Load(
          J->getObjLinkingLayer(), EAItr->c_str(), *TT)));
    }
  }

  // Add the objects.
  for (auto &ObjPath : ExtraObjects) {
    auto Obj = ExitOnErr(errorOrToExpected(MemoryBuffer::getFile(ObjPath)));
    ExitOnErr(J->addObjectFile(std::move(Obj)));
  }

  // Run any static constructors.
  ExitOnErr(J->initialize(J->getMainJITDylib()));

  // Run any -thread-entry points.
  std::vector<std::thread> AltEntryThreads;
  for (auto &ThreadEntryPoint : ThreadEntryPoints) {
    auto EntryPointSym = ExitOnErr(J->lookup(ThreadEntryPoint));
    typedef void (*EntryPointPtr)();
    auto EntryPoint =
      reinterpret_cast<EntryPointPtr>(static_cast<uintptr_t>(EntryPointSym.getAddress()));
    AltEntryThreads.push_back(std::thread([EntryPoint]() { EntryPoint(); }));
  }

  // Run main.
  auto MainSym = ExitOnErr(J->lookup("main"));

  typedef int (*MainFnPtr)(int, char *[]);
  auto Result = orc::runAsMain(
      jitTargetAddressToFunction<MainFnPtr>(MainSym.getAddress()), InputArgv,
      StringRef(InputFile));

  // Wait for -entry-point threads.
  for (auto &AltEntryThread : AltEntryThreads)
    AltEntryThread.join();

  // Run destructors.
  ExitOnErr(J->deinitialize(J->getMainJITDylib()));

  return Result;
}

void disallowOrcOptions() {
  // Make sure nobody used an orc-lazy specific option accidentally.

  if (LazyJITCompileThreads != 0) {
    errs() << "-compile-threads requires -jit-kind=orc-lazy\n";
    exit(1);
  }

  if (!ThreadEntryPoints.empty()) {
    errs() << "-thread-entry requires -jit-kind=orc-lazy\n";
    exit(1);
  }

  if (PerModuleLazy) {
    errs() << "-per-module-lazy requires -jit-kind=orc-lazy\n";
    exit(1);
  }
}

std::unique_ptr<FDRawChannel> launchRemote() {
#ifndef LLVM_ON_UNIX
  llvm_unreachable("launchRemote not supported on non-Unix platforms");
#else
  int PipeFD[2][2];
  pid_t ChildPID;

  // Create two pipes.
  if (pipe(PipeFD[0]) != 0 || pipe(PipeFD[1]) != 0)
    perror("Error creating pipe: ");

  ChildPID = fork();

  if (ChildPID == 0) {
    // In the child...

    // Close the parent ends of the pipes
    close(PipeFD[0][1]);
    close(PipeFD[1][0]);

    // Execute the child process.
    std::unique_ptr<char[]> ChildPath, ChildIn, ChildOut;
    {
      ChildPath.reset(new char[ChildExecPath.size() + 1]);
      std::copy(ChildExecPath.begin(), ChildExecPath.end(), &ChildPath[0]);
      ChildPath[ChildExecPath.size()] = '\0';
      std::string ChildInStr = utostr(PipeFD[0][0]);
      ChildIn.reset(new char[ChildInStr.size() + 1]);
      std::copy(ChildInStr.begin(), ChildInStr.end(), &ChildIn[0]);
      ChildIn[ChildInStr.size()] = '\0';
      std::string ChildOutStr = utostr(PipeFD[1][1]);
      ChildOut.reset(new char[ChildOutStr.size() + 1]);
      std::copy(ChildOutStr.begin(), ChildOutStr.end(), &ChildOut[0]);
      ChildOut[ChildOutStr.size()] = '\0';
    }

    char * const args[] = { &ChildPath[0], &ChildIn[0], &ChildOut[0], nullptr };
    int rc = execv(ChildExecPath.c_str(), args);
    if (rc != 0)
      perror("Error executing child process: ");
    llvm_unreachable("Error executing child process");
  }
  // else we're the parent...

  // Close the child ends of the pipes
  close(PipeFD[0][0]);
  close(PipeFD[1][1]);

  // Return an RPC channel connected to our end of the pipes.
  return std::make_unique<FDRawChannel>(PipeFD[1][0], PipeFD[0][1]);
#endif
}

redpajama_set_name: RedPajamaGithub


Manning Pool Services is proud to offer discounted pool cleaning services to help support the efforts of Emily Foreman of Infant Swimming Resource (ISR). Emily is a very talented and committed professional in the greater Pearland-Friendswood area, a certified ISR Instructor, and the owner of ISR Pearland.
Infant Swimming Resource, a global leader and the developer of ISR Self-Rescue, is a product of over 45 years of research and hands-on training. ISR is survival swimming lessons for infants and young children, teaching them skills to potentially save themselves or safely await help, should they accidentally fall into a body of water alone. Within a few weeks, infants and young children are taught how to flip onto their backs, float, obtain air, then swim to the edge of the water and pull themselves to safety or remain afloat until help arrives.
For more information about ISR, please contact Emily Foreman through her website: ISRpearland.com, or the ISR national website at www.infantswim.com.[:es]Manning Pool Services is proud to offer discounted pool cleaning services to help support the efforts of Emily Foreman of Infant Swimming Resource (ISR). Emily is a very talented and committed professional in the greater Pearland-Friendswood area, a certified ISR Instructor, and the owner of ISR Pearland.
For more information about ISR, please contact Emily Foreman through her website: ISRpearland.com, or the ISR national website at www.infantswim.com.


It's the weekend and I love going to our local farmers market to get some local and seasonally grown fresh food. I was happy to also pick up some new organic peanut butter and had to make something with it. This recipe for Peanut Butter Blondies is so incredibly easy and great to have on hand incase company stops in.
It is gluten free, dairy free, made with organic products and a little something extra. Just wait...you'll see.
Three things I wanted to share about some of the ingredients in this recipe.
Protein. This little pea provides the amount of protein found in meat and dairy products, but without the high calories and saturated fats.
Manganese. This trace mineral is a cofactor for a number of enzymes to aid in energy production AND antioxidant defences.
Blood sugar. This bean helps balance blood sugar levels while providing a steady slow-burning energy.
Weight loss. Great for weight loss as it helps to control your appetite because of a low GI, making you feel fuller, longer.
Free Run eggs are from chickens that can run free in an open concept barn with nests and perches. They do not go outside.
Free Range eggs? David Suzuki explains it best.
"Free-range" means hens see the light of day (depending on the weather) and their feet actually come in contact with the earth.
In understanding the difference you can choose what you are comfortable supporting and purchasing. But keep in mind, not every egg producer has the same ideas of an open concept barn. Some farmers may have an open concept barn for chickens to walk about, but it may also mean that each chicken has about 1 square foot of space. So thousands of chickens could be living the 'wonderful' open concept life. Check with the producers, call them and find out.
For the sake of this recipe, I'm using a Free Range organic egg from a local farm in my area.
For the topping of this protein packed snack, I'm using a favorite chocolate of mine. Triple Truffle™ Chocolate by Youngevity. This dark chocolate is chalk full of calcium, vitamin D, and magnesium. It also contains ingredients to boost your immune system and is full of antioxidants. It has over a 16,000 ORAC value. That's HUGE! With the cold and flu season upon us, this chocolate is my indulgence but also my daily dose to stay healthy.
My children love it too!
Now let's get to the good stuff! These peanut butter blondies are smooth, creamy and light.
Pre heat oven at 350F.
Mix all ingredient (except the chocolate) in a food processor/blender. Blend until impossibly smooth.
Butter a 8x8 baking dish. I always save the wrapping from my blocks of butter for jobs just like this.
Pour your blondie mixture into the prepared baking dish and smooth out. Then sprinkle with your Triple Truffle™ Chocolate (or dark chocolate chips).
Bake for about 20 minutes (depending on your oven this will vary) or until cooked through out.
Let it cook down. Or if you're impatient like me and want it to go with your morning coffee, put it in the fridge or freezer for a few minutes. Once it has cooled down, cut into squares and enjoy!
I hope you enjoy these blondies as much as I do. And that each and everyone of you can have your very own 'Blondie' moment.
*original recipe brought to you by www.heatherrobertson.com (alternations made to make it complete organic and Dr. Glidden approved).


text:
Labor and strikes
Killing workers, jacking-up prices: Dead animal capitalists sacrificed meat and poultry workers
December 3, 2021 Stephen Millies
Fifty-nine thousand workers at the five biggest U.S. meatpacking companies fell ill from COVID-19. That's three times higher than previous estimates, according to the House of Representatives Subcommittee on the Coronavirus Crisis. At least 269 […]
Philadelphia: March for Mumia, Dec. 11
December 2, 2021 Struggle - La Lucha
SATURDAY, DECEMBER 11, 2021 AT 1 PM – 3 PM March for Mumia! Octavius V. Catto Monument, South side of City Hall, Philadelphia FORTY YEARS OF UNJUST IMPRISONMENT IS 40 YEARS TOO MUCH! Mumia Abu-Jamal […]
Fight racism
John Parker interview: 'White supremacy and capitalist decline'
On PressTV
Honduras said enough and opened its doors to new hope
December 2, 2021 Alejandra Garcia
Honduras went to the polls last Sunday amid a process of historic importance. People flocked to the polling stations, despite political violence and fears induced by the narco regime of outgoing President Juan Orlando Hernández […]
Los campesinos y campesinas de la India defienden los derechos de todos los campesinos
December 1, 2021 Vijay Prashad
El 19 de noviembre de 2021, el primer ministro de la India, Narendra Modi declaró: "Hemos decidido derogar las tres leyes agrícolas". Se refería a tres leyes que se habían aprobado apresuradamente en el Parlamento durante el 2020. […]
Los Angeles: Leveling Up, Dec. 2
THURSDAY, DECEMBER 2, 2021 AT 11:30 PM EST Leveling Up Harriet Tubman Center for Social Justice – L.A. From an award-winning playwright Deborah Zoe Laufer and renowned director Jozben Barrett comes a story relevant to […]

redpajama_set_name: RedPajamaCommonCrawl


Tarrytown, NY, Oct. 16, 2018 (GLOBE NEWSWIRE) -- via NEWMEDIAWIRE -- MJ Munchies, Inc., a wholly owned subsidiary of Nightfood Holdings, Inc. (OTC: NGTF), has announced entry into the THC and CBD beverage space with its Half-Baked brand.
The Company has signed commitments to move forward with the introduction of Half-Baked branded edibles in California in January. In addition, Management intends to leverage the Half-Baked name across a line of beverages, also to be introduced in 2019 Q1. Discussions are underway with potential manufacturing and distribution partners.
Statistics show that new and recreational marijuana users prefer consumption options other than smoking. MJ Munchies intends to capitalize on the trend towards edibles and beverages with innovative products in both categories.
Management has previously stated that it plans to launch uniquely differentiated edibles products with proprietary and patent protected ingredients. The Company believes that doing so will enable it to deliver unique benefits to consumers of Half-Baked products, therefore establishing a more powerful and more valuable brand.
With a fully granted trademark of the Half-Baked brand, and federal trademark applications in process for the Half-Baked name in baked goods, cookies, chocolates, gummies, and now beverages, development has also begun on the HalfBaked.com website. The Company is expected to provide an update on branding and packaging design in the coming weeks.
Recent industry activity has seen Constellation Brands investing $4B in Canopy Growth Corporation and Coke has publicly expressed interest in the space as well. It's reasonable to believe additional snack and beverage brands will seek out opportunities to gain a competitive advantage when they decide the time is right to enter the market.
NightFood Holdings, Inc. (OTC: NGTF), operates both NightFood, Inc. and MJ Munchies, Inc.


text:
Rajiv Ouseph aims for stint at the top after record sixth title
Rajiv Ouseph convinced he can be England's top-ranked player for years to come sixth straight National Championships title
Monday 4 February 2013, 11:33 UK
Rajiv Ouseph is convinced he can be England's top-ranked player for years to come after claiming a record sixth straight English National Badminton Championships title in Manchester.
Ouseph beat former England number one Carl Baxter in straight sets at the National Cycling Centre, winning 21-13, 21-15 in 30 minutes.
Baxter has now been beaten by Ouseph, who competed for Team GB at the London 2012 Olympics, in each of the last five years.
It proved another straight forward run to the title for Ouseph, who didn't drop a set throughout.
Now the world no.34 wants to take his home form onto the international circuit as he begins his cycle towards competing at Rio 2016.
"I was just happy to win and win convincingly, said the Hounslow-born 26-year-old. "That is what I came to do and to just show the guys that is my level and they need to play very well to beat me.
"It is always good to win a tournament, wins are something you can't really put a price on and if I can take this form into the Europeans and then the All-England Open I will be happy with that.
"Since the start of 2013 I have played quite well in the international tournaments and also here this week so if I can take this form going forward I will be very happy.
"I'm still young enough to play the next Olympics and playing in London has given me a bit of a taster to go for the next one.
"I'd like to think that in there years time I will be there or thereabouts for qualifying and hopefully do a little bit better."
Next up, come & experience the world's best players and London 2012 Olympians at the Yonex All England Open Badminton Championships. For more information, visit www.allenglandbadminton.com
Six Nations 2013: Kidney hopes O'Driscoll extends Ireland career
Jessica Ennis opts to shun indoor season to focus on Moscow